背景

准备工具

这里python实现,也可以通过Java、php实现

  • 一台云服务器,并且已经安装Python3;(本地电脑是不可以的,必须要服务器)

  • 个人公众号;

详细步骤

安装werobot

sudo pip3 install werobot

1.云服务器:启动微信公众号服务

### autoResponse.py
# 最简单的Hello World, 会给收到的每一条信息回复 Hello World

import werobot

robot = werobot.WeRoBot(token='tokenhere')

@robot.handler
def hello(message):
    return 'Hello World!'

# 让服务器监听在 0.0.0.0:80
robot.config['HOST'] = '0.0.0.0'
robot.config['PORT'] = 80
robot.run()

启动成功如图所示

2.1微信公众号:后台配置Token

后台配置token,就是上文启动微信公众号后台服务的token,配置如果如下图所示:

2.2微信公众号:启用服务器配置

开发者密码(AppSecret)

微信公众后台配置完毕,现在就正式开始编辑推送文章了

3云服务器: 编辑python代码,推送文章到图文素材库

##public/upload_news.py
# -*- coding: utf-8 -*-
"""
推送文章到微信公众号
"""

from datetime import datetime ,timedelta
import time
import urllib
from werobot import WeRoBot
robot = WeRoBot()
robot.config["APP_ID"] = "wxf88a0d649xxxxx" ##替换成自己公众号
robot.config["APP_SECRET"] = "d74f349cfdbdxxxxxx" ##替换成自己公众号
client = robot.client
token = client.grant_token()
print(token)
print('*'*30)

def get_img_media_id(img_url,img_file_name):
  """
  * 上传临时素菜
  * 1、临时素材media_id是可复用的。
  * 2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
  * 3、上传临时素材的格式、大小限制与公众平台官网一致。
  """

  resource = urllib.request.urlopen(img_url)
  f_name = img_file_name
  with open(f_name, 'wb'as f:
    f.write(resource.read())
  #media_json = client.upload_media("image", open(r"./img_media.jpg", "rb")) ## 临时素材
  media_json = client.upload_permanent_media("image", open(r"./img_media.jpg""rb")) ##永久素材
  media_id = media_json['media_id'
  media_url = media_json['url'
  print('微信素材id:',media_id) 
  return media_id


def upload_media_news(string_date,title,content):
    """
    上传到微信公众号素材
    """

    string_date = datetime.strptime(string_date, '%Y%m%d')
    TITLE = title
    img_url = 'https://www.baidu.com/img/flexible/logo/pc/result@2.png'
    img_file_name = 'img_media.jpg'
    media_id = get_img_media_id(img_url,img_file_name)
    THUMB_MEDIA_ID = media_id
    AUTHOR = 'SQL数据分析'
    show_cover_pic = 1 
    CONTENT = content + string_date.strftime('%Y年%m月%d日')
    CONTENT_SOURCE_URL = 'https://www.baidu.com/'

    articles = [{
      "title": TITLE,
      "thumb_media_id": THUMB_MEDIA_ID,
      "author": AUTHOR,
      "digest"'',
      "show_cover_pic"1,
      "content": CONTENT,
      "content_source_url": CONTENT_SOURCE_URL
    }
    # 若新增的是多图文素材,则此处应有几段articles结构,最多8段
    ]

    news_json = client.add_news(articles)
    print(news_json)
    media_id = news_json['media_id']
    print('media_id',media_id)
    return news_json

def run(string_date):
    title = 'SQL数据分析-自动采集素材文章'
    content ='<p>SQL数据分析-这是内容</p>'
    news_json = upload_media_news(string_date,title,content) 
    print('successful')

if __name__ == "__main__":
    start_time = time.time() # 开始时间
    today = datetime.today() 
    string_date = today.strftime('%Y%m%d')
    try:
        run(string_date)
    except:
        run(string_date)
    end_time = time.time() #结束时间
    print("程序耗时%f秒." % (end_time - start_time))

新窗口,运行python文件;

结果展示

云服务器结果

微信公众号后台结果

图文素材内容:

后续可以自行多看文档

文档地址:WeRoBot — WeRoBot 1.13.1 文档

交流群

  • 关注公众号:SQL数据分析,可以获取其他精彩内容

  • 由于微信群二维码7天失效,请添加个人微信(base64解密)后再入群:a2VtaXN0ZXAKIA==

群发环节:

  • 由于个人公众号无群发权限,导致无法推送,后续可以在订阅号助手,手动点击推送;

  • 认证的个人公众号、企业号有推送权限,可以自动推送成功;

QA环节

Q:OSError: [Errno 98] Address already in use 代表了端口被占用

A: 端口占用
OSError: [Errno 98] Address already in use 代表了端口被占用

端口映射
将8083端口转发到80端口

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8083

Q:werobot.client.ClientException: 40164: invalid ip XXX, not in whitelist rid: 604cab22-73c30198-278b2150

A: 需要再微信公众号后台,将服务器地址,添加到白名单配置中


本文分享自微信公众号 - SQL数据分析(dianwu_dw)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

03-24 01:46
查看更多