前言
最近网上很火的给女朋友做公众号推送,作者 小红书 @猪咪不是猪 且做作者 大方的共享成品 源码 +教学 +自动版本
起初,人们认为这仅仅只是个简单且幼稚,只为图一乐的微信消息模板。
后来,什么云服务器,php,html,个人主页,点滴相册,企业微信,各种各样的花式模板,易语言都来了,属实是杀鸡用牛刀。
我就不用云服务器了(没钱),准备参考python版本的,使用公司服务器做每天的定时发送。相比自己个人IP或者云服务器,需要解决两个问题:1. 公司服务器对微信的服务器有封锁,正常情况下是访问不了微信公众号接口的 2. 找了很久的方法,通过转发是可以绕开的,当然这仅仅针对微信公众号接口。修改代码,request/get/post需要走本地的127.0.0.1:10809(懂的都懂)。
一、微信公众号接口
先下载个参考代码
https://gitee.com/lifeixue/weather-push-python?_from=gitee_search
公众号推送早安问候以及天气预报, 程序员必备撩妹工具,微信自动发送问候语以及天气预报,每天早中晚定时骚扰
-
微信公众平台接口测试账号申请:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
-
申请登录之后
-
在 config.txt 里面填写配置项信息
-
模板示例如下
{{date.DATA}}
地区:{{region.DATA}}
天气:{{weather.DATA}}
气温:{{temp.DATA}}
风向:{{wind_dir.DATA}}
今天是我们相恋的第{{love_day.DATA}}天
{{birthday1.DATA}}
{{birthday2.DATA}}
{{note_en.DATA}}
{{note_ch.DATA}}
- 关于和风天气
和风天气开放平台(注册登录):https://dev.qweather.com/
控制台创建应用(获取Key):https://console.qweather.com/#/apps?lang=zh
注意:在 config.txt 中的 weather_key 填写获取到的 Key
二、使用步骤
如果你是自己的电脑,申请注册之后基本就可以直接食用了,但如果你的电脑和我的一样,没办法直接访问上述接口的网站,可以试着和我一样,搭个127.0.0.1:10809(懂的都懂),将http和https通过本地转发
原本的代码用的是get和post,不知道怎么添加127.0.0.1:10809(懂的都懂),改成了request,json的load方式也改了一下
def get_access_token():
app_id = config["app_id"]
app_secret = config["app_secret"]
post_url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}".format(app_id, app_secret))
proxies = {
'https': 'https://127.0.0.1:10809',
'http': 'http://127.0.0.1:10809'
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
opener = request.build_opener(request.ProxyHandler(proxies))
request.install_opener(opener)
req = request.Request(post_url, headers=headers)
response = request.urlopen(req)
access_token =json.loads(response.read().decode())["access_token"]
return access_token
使用request的,urlopen打开中文的url会报错’ascii’ codec can’t encode characters in position 29-31: ordinal not in range(128),修改如下:
def get_weather(region):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
key = config["weather_key"]
region_url = "https://geoapi.qweather.com/v2/city/lookup?location={}&key={}".format(parse.quote(region), key)
proxies = {
'https': 'https://127.0.0.1:10809',
'http': 'http://127.0.0.1:10809'
}
opener = request.build_opener(request.ProxyHandler(proxies))
request.install_opener(opener)
req = request.Request(region_url, headers=headers)
response = request.urlopen(req)
html = response.read()
buff = BytesIO(html)
location_id =json.loads(gzip.GzipFile(fileobj=buff).read().decode())["location"][0]["id"]
前面无论是天气的接口,还是微信公众号获取access_token的,直接在传参的时候加上proxy就能用了,但是在最后一步,调用微信公众号post模板的data时,上面的写法一直不起作用,最后用下面这种写法才成功了:1.can’t concat bytes to str 通过bytes(json.dumps(datas)将数据先转一下格式,然后request_obj.set_proxy(‘127.0.0.1:10809’,‘https’)设置daili:
url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(access_token)
header_selfdefine={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
}
request_obj=request.Request(url=url,data=bytes(json.dumps(datas), encoding="utf-8"),headers=header_selfdefine)
request_obj.set_proxy('127.0.0.1:10809','https')
response_obj=request.urlopen(request_obj)
response = json.loads(response_obj.read().decode('utf-8'))
最后就是优化自己的模板和config格式了,参考原本的格式修改即可,增加时间控制的函数,让程序在每天特定的时间执行,
def main():
LOVE_FLAG = False
old_today = datetime.date(int(strftime('%Y',time.localtime(time.time()))),int(strftime('%m',time.localtime(time.time()))),int(strftime('%d',time.localtime(time.time()))))
while(True):
new_today = datetime.date(int(strftime('%Y',time.localtime(time.time()))),int(strftime('%m',time.localtime(time.time()))),int(strftime('%d',time.localtime(time.time()))))
if(old_today != new_today):
LOVE_FLAG = False
old_today = new_today
if(LOVE_FLAG==False):
if(strftime('%H:%M',time.localtime(time.time())) == "22:00"):
LOVE_FLAG = True
LOVE()
else:
time.sleep(30)
else:
time.sleep(60*60*12)
最后的最后,使用pyinstaller打包成一个exe文件,运行起来即可。
py -3.10 -m PyInstaller -F -w main.py
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)