开发环境准备

  • 公众号开启 开发者密码 记录公众号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发布的文章 不会推荐 不显示在主页 无法选择原创,开启赞赏等 所以目前个人自动发布到草稿 然后发消息给手机
  • 等有空集中处理下