Kaynağa Gözat

fix:新增自动登录获取cookie

Roc 8 ay önce
ebeveyn
işleme
4fa65bb4b2
4 değiştirilmiş dosya ile 200 ekleme ve 23 silme
  1. 8 0
      go.mod
  2. 20 0
      go.sum
  3. 168 23
      services/base_from_ccf/common.go
  4. 4 0
      utils/config.go

+ 8 - 0
go.mod

@@ -21,6 +21,12 @@ require (
 	github.com/andybalholm/cascadia v1.3.2 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/chromedp/cdproto v0.0.0-20240202021202-6d0b6a386732 // indirect
+	github.com/chromedp/chromedp v0.9.5 // indirect
+	github.com/chromedp/sysutil v1.0.0 // indirect
+	github.com/gobwas/httphead v0.1.0 // indirect
+	github.com/gobwas/pool v0.2.1 // indirect
+	github.com/gobwas/ws v1.3.2 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect
 	github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 // indirect
@@ -29,7 +35,9 @@ require (
 	github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect
 	github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
 	github.com/kr/text v0.2.0 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/metakeule/fmtdate v1.1.2 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect

+ 20 - 0
go.sum

@@ -10,11 +10,23 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
 github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chromedp/cdproto v0.0.0-20240202021202-6d0b6a386732 h1:XYUCaZrW8ckGWlCRJKCSoh/iFwlpX316a8yY9IFEzv8=
+github.com/chromedp/cdproto v0.0.0-20240202021202-6d0b6a386732/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
+github.com/chromedp/chromedp v0.9.5 h1:viASzruPJOiThk7c5bueOUY91jGLJVximoEMGoH93rg=
+github.com/chromedp/chromedp v0.9.5/go.mod h1:D4I2qONslauw/C7INoCir1BJkSwBYMyZgx8X276z3+Y=
+github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic=
+github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
+github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
+github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
+github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
+github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
+github.com/gobwas/ws v1.3.2 h1:zlnbNHxumkRvfPWgfXu8RBwyNR1x8wh9cf5PTOCqs9Q=
+github.com/gobwas/ws v1.3.2/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
@@ -38,12 +50,17 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/metakeule/fmtdate v1.1.2 h1:n9M7H9HfAqp+6OA98wXGMdcAr6omshSNVct65Bks1lQ=
@@ -54,6 +71,7 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ=
 github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
+github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
 github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
 github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -124,9 +142,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
 golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

+ 168 - 23
services/base_from_ccf/common.go

@@ -3,14 +3,18 @@ package base_from_ccf
 import (
 	"bytes"
 	"compress/gzip"
+	"context"
 	"encoding/json"
 	"eta/eta_data_analysis/utils"
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
+	"github.com/chromedp/cdproto/network"
+	"github.com/chromedp/chromedp"
 	"golang.org/x/net/html/charset"
 	"golang.org/x/text/encoding/simplifiedchinese"
 	"golang.org/x/text/transform"
-	"io/ioutil"
+	"io"
+	"log"
 	"net/http"
 	"net/url"
 	"os"
@@ -43,7 +47,7 @@ func postEdbLib(param map[string]interface{}, method string) (result []byte, err
 // httpPost HTTP请求
 func httpPost(url, postData string, params ...string) ([]byte, error) {
 	fmt.Println("httpPost Url:" + url)
-	body := ioutil.NopCloser(strings.NewReader(postData))
+	body := io.NopCloser(strings.NewReader(postData))
 	client := &http.Client{}
 	req, err := http.NewRequest("POST", url, body)
 	if err != nil {
@@ -60,8 +64,10 @@ func httpPost(url, postData string, params ...string) ([]byte, error) {
 		fmt.Println("client.Do err:" + err.Error())
 		return nil, err
 	}
-	defer resp.Body.Close()
-	b, err := ioutil.ReadAll(resp.Body)
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, err := io.ReadAll(resp.Body)
 	if err != nil {
 		fmt.Println("httpPost:" + string(b))
 	}
@@ -69,7 +75,7 @@ func httpPost(url, postData string, params ...string) ([]byte, error) {
 }
 
 // fetchPageHtml 获取网站HTML文本
-func fetchPageHtml(baseUrl string) (respBody []byte, err error) {
+func fetchPageHtml(baseUrl string, fetchNum int) (respBody []byte, err error) {
 	defer func() {
 		if err != nil {
 			tips := fmt.Sprintf("BuildCCFRequest ErrMsg: %s", err.Error())
@@ -77,26 +83,19 @@ func fetchPageHtml(baseUrl string) (respBody []byte, err error) {
 			fmt.Println(tips)
 		}
 	}()
+	// 查询次数
+	fetchNum++
 	if baseUrl == "" {
 		err = fmt.Errorf("CCF请求地址为空")
 		return
 	}
 
-	// 读取Cookie
-	if utils.CCFCookieFile == "" {
-		err = fmt.Errorf("cookie文件未配置")
-		return
-	}
-	cookieByte, e := ioutil.ReadFile(utils.CCFCookieFile)
+	// 获取Cookie
+	strCookie, e := getCookie()
 	if e != nil {
 		err = fmt.Errorf("读取cookie文件失败, err: %s", e.Error())
 		return
 	}
-	strCookie := strings.TrimSpace(string(cookieByte))
-	if strCookie == "" {
-		err = fmt.Errorf("cookie为空")
-		return
-	}
 
 	// 拉取网站内容
 	cli := new(http.Client)
@@ -137,7 +136,7 @@ func fetchPageHtml(baseUrl string) (respBody []byte, err error) {
 		err = fmt.Errorf("gzip NewReader err: %s", e.Error())
 		return
 	}
-	body, e := ioutil.ReadAll(reader)
+	body, e := io.ReadAll(reader)
 	if e != nil {
 		err = fmt.Errorf("read body err: %s", e.Error())
 		return
@@ -149,12 +148,25 @@ func fetchPageHtml(baseUrl string) (respBody []byte, err error) {
 		err = fmt.Errorf("utf8 reader err: %s", e.Error())
 		return
 	}
-	utf8Body, e := ioutil.ReadAll(utf8Reader)
+	utf8Body, e := io.ReadAll(utf8Reader)
 	if e != nil {
 		err = fmt.Errorf("utf8 body err: %s", e.Error())
 		return
 	}
 	respBody = utf8Body
+
+	isLoginPage := checkIsLoginPage(string(respBody))
+	fmt.Println("是否登录页:", isLoginPage)
+
+	// 如果是登录页,且查询次数少于2次,那么就重新登录后查询
+	if isLoginPage && fetchNum < 2 {
+		_, err = getCookieByChrome()
+		if err != nil {
+			return
+		}
+		return fetchPageHtml(baseUrl, fetchNum)
+	}
+
 	return
 }
 
@@ -198,7 +210,7 @@ func loadDataRule(nameKey string) (fetchRule *DataRule, err error) {
 		err = fmt.Errorf("rule文件不存在")
 		return
 	}
-	b, e := ioutil.ReadFile(utils.CCFDataRuleFile)
+	b, e := os.ReadFile(utils.CCFDataRuleFile)
 	if e != nil {
 		err = fmt.Errorf("读取rule文件失败, err: %v", e)
 		return
@@ -264,7 +276,7 @@ func savePageHtml(nameKey, saveDir string, historyPage bool, reportMax int) (fil
 	firstPage := fmt.Sprintf(`%s&cur_pg_num=%d`, baseUrl, 1)
 
 	// 首页报告链接
-	firstHtml, e := fetchPageHtml(firstPage)
+	firstHtml, e := fetchPageHtml(firstPage, 0)
 	if e != nil {
 		err = fmt.Errorf("获取首页HTML失败, err: %v", e)
 		return
@@ -295,7 +307,7 @@ func savePageHtml(nameKey, saveDir string, historyPage bool, reportMax int) (fil
 				// 每页28条数据, 需要带上页码*28的偏移量不然始终获取第一页
 				pageUrl := fmt.Sprintf(`%s&cur_pg_num=%d&cur_row_pos=%d`, baseUrl, i, i*28)
 				fmt.Println("pageUrl: ", pageUrl)
-				pageContents, e := fetchPageHtml(pageUrl)
+				pageContents, e := fetchPageHtml(pageUrl, 0)
 				if e != nil {
 					err = fmt.Errorf("获取首页HTML失败, err: %v", e)
 					return
@@ -328,7 +340,7 @@ func savePageHtml(nameKey, saveDir string, historyPage bool, reportMax int) (fil
 		}
 		fmt.Printf("拉取报告: %s; url: %s\n", v.Title, v.Href)
 
-		htm, e := fetchPageHtml(fmt.Sprintf("%s%s", CCFReportDetailBaseUrl, v.Href))
+		htm, e := fetchPageHtml(fmt.Sprintf("%s%s", CCFReportDetailBaseUrl, v.Href), 0)
 		if e != nil {
 			utils.FileLog.Info("获取页面失败, err: %v", e)
 			continue
@@ -414,7 +426,9 @@ func writeHTMLToFile(content string, filePath string) error {
 	if err != nil {
 		return err
 	}
-	defer file.Close()
+	defer func() {
+		_ = file.Close()
+	}()
 
 	// 将HTML内容写入文件
 	_, err = file.WriteString(content)
@@ -727,3 +741,134 @@ func formatIntervalData(cellTxt, flag string) string {
 
 	return fmt.Sprint(average)
 }
+
+// getCookie
+// @Description: 获取cookie
+// @author: Roc
+// @datetime 2024-07-09 14:00:53
+// @return cookieStr string
+// @return err error
+func getCookie() (cookieStr string, err error) {
+	// 读取Cookie
+	if utils.CCFCookieFile == "" {
+		err = fmt.Errorf("cookie文件未配置")
+		return
+	}
+	cookieByte, e := os.ReadFile(utils.CCFCookieFile)
+	if e != nil {
+		err = fmt.Errorf("读取cookie文件失败, err: %s", e.Error())
+		return
+	}
+	cookieStr = strings.TrimSpace(string(cookieByte))
+	if cookieStr == "" {
+		err = fmt.Errorf("cookie为空")
+		return
+	}
+
+	return
+}
+
+// getCookieByChrome
+// @Description: 获取cookie
+// @author: Roc
+// @datetime 2024-07-09 14:00:53
+// @return cookieStr string
+// @return err error
+func getCookieByChrome() (cookieStr string, err error) {
+	// 读取Cookie
+	if utils.CCFUseName == "" {
+		err = fmt.Errorf("CCF账号未设置")
+		return
+	}
+	if utils.CCFPassword == "" {
+		err = fmt.Errorf("CCF密码未设置")
+		return
+	}
+	opts := append(
+		chromedp.DefaultExecAllocatorOptions[:],
+		chromedp.Flag("headless", false),
+	)
+	allocCtx, cancel1 := chromedp.NewExecAllocator(context.Background(), opts...)
+	defer cancel1()
+
+	// 创建chrome实例
+	ctx, cancel2 := chromedp.NewContext(
+		allocCtx,
+		chromedp.WithLogf(log.Printf),
+	)
+	defer cancel2()
+	err = chromedp.Run(ctx,
+		chromedp.Navigate(`https://www.ccf.com.cn/member/member.php`),
+		chromedp.SetValue(`input[name="username"]`, utils.CCFUseName, chromedp.ByQuery),
+		chromedp.SetValue(`input[name="password"]`, utils.CCFPassword, chromedp.ByQuery),
+		chromedp.Sleep(2*time.Second),
+		chromedp.Click(`input[id="imageField"]`, chromedp.ByQuery),
+		chromedp.Sleep(5*time.Second),
+
+		chromedp.Navigate(`https://www.ccf.com.cn/newscenter/detail-410000-2024070600003.shtml`),
+		chromedp.Sleep(2*time.Second),
+		chromedp.ActionFunc(func(ctx context.Context) error {
+			cookies, err := network.GetCookies().Do(ctx)
+			if err != nil {
+				return err
+			}
+			//cookieJson, err := json.Marshal(cookies)
+			//if err != nil {
+			//	return err
+			//}
+			//fmt.Println("cookieJson:", string(cookieJson))
+			//utils.FileLog.Info("cookieJson:" + string(cookieJson))
+			for _, v := range cookies {
+				cookieStr = cookieStr + v.Name + "=" + v.Value + ";"
+			}
+			//fmt.Println("header cookie:", cookieStr)
+			//utils.FileLog.Info("header cookie:" + cookieStr)
+
+			tmpFile, tmpErr := os.Create(utils.CCFCookieFile)
+			if tmpErr != nil {
+				fmt.Println("创建cookie文件失败:", tmpErr.Error())
+				return nil
+			}
+			if _, err := tmpFile.WriteString(cookieStr); err != nil {
+				fmt.Println("写入cookie到文件失败:", err.Error())
+				return nil
+			}
+			return nil
+		}),
+	)
+
+	//if err != nil {
+	//	fmt.Println(err)
+	//}
+
+	return
+}
+
+// checkIsLoginPage
+// @Description: 校验是否是登录页
+// @author: Roc
+// @datetime 2024-07-09 16:34:17
+// @param bodyStr string
+// @return isLoginPage bool
+func checkIsLoginPage(bodyStr string) (isLoginPage bool) {
+	// 初始化goquery.Document
+	doc, err := goquery.NewDocumentFromReader(strings.NewReader(bodyStr))
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// 查找name为LoginForm的表单
+	doc.Find("form[name=LoginForm]").Each(func(i int, s *goquery.Selection) {
+		// 如果找到了,打印信息表示这是登录页
+		//fmt.Println("这是一个登录页面")
+		isLoginPage = true
+		return
+	})
+
+	// 如果没有找到,打印信息表示这不是登录页
+	//if doc.Find("form[name=LoginForm]").Length() == 0 {
+	//	fmt.Println("这不是一个登录页面")
+	//}
+
+	return
+}

+ 4 - 0
utils/config.go

@@ -75,6 +75,8 @@ var (
 	CCFDailyTaskTime  string // CCF数据日度任务时间
 	CCFWeeklyTaskTime string // CCF数据周度任务时间
 	CCFStockTaskTime  string // CCF数据装置任务时间
+	CCFUseName        string // CCF登录账号
+	CCFPassword       string // CCF登录密码
 )
 
 var TerminalCode string
@@ -160,6 +162,8 @@ func init() {
 		CCFDailyTaskTime = config["ccf_daily_task_time"]
 		CCFWeeklyTaskTime = config["ccf_weekly_task_time"]
 		CCFStockTaskTime = config["ccf_stock_task_time"]
+		CCFUseName = config["ccf_username"]
+		CCFPassword = config["ccf_password"]
 	}
 }