开发环境准备
- 公众号开启 开发者密码 记录公众号AppID/AppSecret
- 配置IP白名单 要有一台固定IP的服务器
定期扫描新增博客md文档
find ~/blog/content -name “*.md” >AllMdFiles.dat
grep -v -F -x -f doneMdFiles.dat AllMdFiles.dat > todoMdFiles.dat
可以采用上述脚本实现 处理完毕后写入doneMdFiles.dat
解析md文档
- 解析元数据信息 包括title标题 作者 cover名称
- 解析正文
上传图片正文的图片
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=%s&type=%s", WechatAccessToken, mediaType) body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("media", fileName) req.Header.Set("Content-Type", writer.FormDataContentType()) resp, err := http.DefaultClient.Do(req) var result struct { MediaID string `json:"media_id"` Url string `json:"url"` } err = json.NewDecoder(resp.Body).Decode(&result) 会应答图片的media_id和可以在公众号使用的图片url
正文markdown转公众号格式
golang没有找到特别好的库 曲线救国
访问https://doocs.github.io/md/ 然后将正文内容自动输入 自动获取output内容
个人目前使用的chromedp库 核心代码
err = chromedp.Run(ctx, chromedp.Navigate(MarkDownToWechatUrl), // 打开目标网页 chromedp.WaitVisible(`[class="CodeMirror cm-s-xq-light CodeMirror-wrap"]`, chromedp.ByQuery), //编辑区出现 等待元素可见 chromedp.EvaluateAsDevTools(` var codeMirrorDiv = document.querySelector('[class="CodeMirror cm-s-xq-light CodeMirror-wrap"]'); var setValueContent = "`+mdContentInfo+`"; codeMirrorDiv.CodeMirror.setValue(setValueContent); `, nil), // 输入markdown格式内容 chromedp.Sleep(3*time.Second), //等待3秒钟 chromedp.OuterHTML("#output-wrapper", &previewContent, chromedp.NodeVisible), //chromedp.OuterHTML(".preview", &previewContent, chromedp.NodeVisible), )
发送草稿
调用API本身不复杂 核心代码如下:
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/draft/add?access_token=%s", WechatAccessToken) // 构建请求体 article := Article{ Title: meta.Title, Author: meta.Author[0], Digest: meta.Description, Content: wechatContent, ContentSourceURL: meta.OriginalUrlPath, ThumbMediaID: coverImgMediaId, } requestBody := DraftAddRequest{ Articles: []Article{article}, } // 将请求体转换为 JSON 格式 jsonData, err := json.Marshal(requestBody) response, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData)) err = json.NewDecoder(response.Body).Decode(&draftAddResponse) log.Printf("草稿添加成功 media_id:%s\n", draftAddResponse.MediaID)
手工登录公众号平台发布
- 通过API发布的文章 不会推荐 不显示在主页 无法选择原创,开启赞赏等 所以目前个人自动发布到草稿 然后发消息给手机
- 等有空集中处理下