windows环境基于python 实现微信公众号文章推送

材料:

 1、python 2.7 或者 python3.x 

 2、windows 可以通过 “python -m pip --version” 查看当前的pip 版本

E:\Downloads\newsInfo>python -m pip --version
pip 20.3.4 from C:\Python27\lib\site-packages\pip (python 2.7)

 3、windows 系统

制作:

1、安装python

打开 WEB 浏览器访问Python Releases for Windows | Python.org

下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可

注意:部分电脑环境可能需要配置环境变量,参考Python 环境搭建 | 菜鸟教程

2、安装 pip

下载与自己python版本对应的get-pip.py 且切换到该文件目录后执行如下命令

python get-pip.py

测试安装是否成功(注:未配置环境变量的情况,若已配置环境变量,使用pip -version)

python -m pip --version

验证: 

   

3、安装 flask(用于简单的服务发布测试)

通过 python -m pip install flask 安装flask框架 

4、程序目录结构

 5、编写main.py 

#!/usr/bin/python
# -*- coding: UTF-8 -*-from flask import Flask,render_template,request,jsonify
import requests
import json
import chardetapp = Flask(__name__)@app.route('/',methods=['POST'])
def start():data = request.get_json()file_path = data.get('file_path')#print("file_path",file_path)mediaInfo = data.get('mediaInfo')#mediaInfos = json.dumps(mediaInfo, ensure_ascii=False)print("mediaInfo",mediaInfo)#mediaInfo =  chardet.detect(str(json.dumps(mediaInfo)).encode())#mediaInfo = json.dumps(mediaInfo,ensure ascii-False)#file_path = 'C:\Users\mpf\Desktop/20240819172400.png'wxpublish(file_path,mediaInfo)return "s"def wxpublish(file_path,mediaInfo):access_token = getWX_token()print(access_token)media_id = upload_material(access_token,file_path)print("media_id",media_id)mediaInfo.update({'thumb_media_id': media_id})list_data = [mediaInfo]media_id = save_draft(access_token,list_data)print("save_media_id",media_id)freepublish(access_token,media_id)def getWX_token():url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=(变量APPID)&secret=(变量SECRETID)'resp = requests.get(url)if resp.status_code == 200:data =  resp.json()tokenjson = data.get('access_token','N/A')return tokenjsonelse:print('Failed',resp.status_code)def upload_material(access_token,file_path):url = 'https://api.weixin.qq.com/cgi-bin/material/add_material'if is_empty_string(file_path):file_path = '/20240819172400.png'   files = {'media': open(file_path, 'rb')}data = {"access_token" : access_token,"type" : "image"}try:resp = requests.post(url, files=files, data=data)resp.raise_for_status()data =  resp.json()media_id = data.get('media_id','N/A')return str(media_id)except requests.exceptions.RequestException as e:print("bpf",e)except requests.exceptions.HTTPError as e:print("efg",e)except Exception as e:print("upload_materialabcd:",e)finally:for key, value in files.items():if value:value.close()def save_draft(access_token,media_mode):url = 'https://api.weixin.qq.com/cgi-bin/draft/add'data = {"articles": media_mode}params = {"access_token" : access_token}headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',"Accept":'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',"Accept-Encoding":'gzip, deflate, br',"Connection":'keep-alive',"Content-Type":'application/json;charset=utf-8',"Cache-Control":'max-age=0'}try:data = json.dumps(data,ensure_ascii=False)print("***",data)resp = requests.post(url,params=params,json=data,headers=headers)resp.raise_for_status()data =  resp.json()media_id = data.get('media_id','N/A')return media_idexcept Exception as e:print("save_draftabcd:",e)finally:print("access_token")def freepublish(access_token,media_id):url = 'https://api.weixin.qq.com/cgi-bin/freepublish/submit'params = {"access_token" : access_token}data = {"media_id": media_id}headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',"Accept":'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',"Accept-Encoding":'gzip, deflate, br',"Connection":'keep-alive',"Content-Type":'application/json;charset=utf-8',"Cache-Control":'max-age=0'}try:data = json.dumps(data,ensure_ascii=False)resp = requests.post(url,params=params,data=data,headers=headers)resp.raise_for_status()data =  resp.json()print(data)except Exception as e:print("freepublishabcd:",e)finally:returndef getHtml_Of_articles():returndef is_empty_string(text):if text.strip() == "":return Trueelse:return Falseif __name__ == '__main__':app.run(debug=True,port=8080)

上述代码片段中有2个关键变量必须是自己的微信公众号APPID和密码 ,分别是(变量APPID)、(变量SECRETID)。

上述代码中包含了获取微信授权token、提交图片素材到微信公众号永久素材库、创建微信公众号素材草稿、发布微信公众号文章几个步骤

6、获取微信公众平台的APPID和密码及设置白名单

公众号平台:https://mp.weixin.qq.com/cgi-bin/frame?t=notification/index_frame

切换菜单到“设置与开发”-->"基础设置",如下图

注:这里的 AppSecret ID生成后需要自己记住,也就是上面代码片段中的(变量SECRETID),这里的APPID就是上面代码片段中的(变量APPID)

7、设置白名单

接第六部白名单设置,公众号开发必须设置白名单。

开发环境:由于我们研发环境基本很难有固定的IP,使用ipconfig/ifconfig都是内网IP(如:192.168.0.X),这种内网IP无法穿透。如何获得自己的临时公网IP呢?

简单:我们只需要打开百度搜索栏输入“IP”即可获得,只是这个地址不定期会变,研发使用已经足够。

8、 添加webhtml模板

   在main.py 同层创建文件夹并命名templates

    在templates目录下新建form.html,index.html 

   index.html 如下

<!DOCTYPE html>
<html>
<head><title>AI发文章</title>
</head>
<body><h1>提交<h1><form action="/start"><input type = "text" name="name" ><input type = "submit" value = "start"></form>
</body>
</html>

 form.html

<!DOCTYPE html>
<html>
<head><title>AI发文章</title>
</head>
<body><h1>成功实现<h1></body>
</html>

9、windows+R 打开,输入"cmd",并切换目录到 main.py 所在目录后执行 "python main.py" 即可

10、postman 请求

 

11、页面请求

12、微信公众号

 

分享

python 2.7 与python 3.x间存在编码不统一问题,可能会在提交草稿步揍出现44003异常。

乱码问题:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算实训30——自动化运维(ansible)

自动化运维 ansible----自动化运维工具 特点&#xff1a; 部署简单&#xff0c;使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大&#xff0c;扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器&#xff1a; #下载epel [rootmo ~]# yum -y i…

windows主机查询url请求来自哪里发起的

最近使用fiddler抓包&#xff0c;看到一直有http://conna.gj.qq.com:47873 的请求&#xff0c; 对此进行溯源&#xff0c;确定是不是被攻击了。 在dos里查询端口进程&#xff1a;netstat -ano | findstr :47873 查到来自8020的进程id 查看此进程应用&#xff0c;发现竟然是…

C++ 设计模式——外观模式

外观模式 C 设计模式——外观模式主要组成部分1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;Subsystem&#xff09;3. 客户端&#xff08;Client&#xff09; 例一&#xff1a;工作流程示例1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;…

IT管理:我与IT的故事6--数字化建设规划工作坊圆满开展

在数字化浪潮席卷全球的时代背景下&#xff0c;企业的数字化转型已成为必然趋势。IT 部落精心打造的数字化规划实操工作坊顺利举办&#xff0c;为众多CIO的数字化转型之路点亮了明灯。 本次工作坊特别邀请到了业界知名的大咖讲师 Frank&#xff0c;他在数字化领域深耕多年&am…

【源码+文档+调试讲解】学院网站

摘 要 使用旧方法对冀中工程技师学院网站的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在冀中工程技师学院网站的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次…

Day23 第十站 文件IO的多路复用

#include <myhead.h>void insert_client(int *client_arr,int *len,int client) {//client_arr[n]{3,4} len&client_count,client_count2;//添加 5 client_arr[2(*len)]5(client)client_arr[*len]client;(*len); } int find_client(int *client_arr,int len,int clie…

Rembg.js - 照片去背景AI开发包

Rembg.js适用于为人物、建筑、电商产品等各种照片自动去除背景&#xff0c;可直接在浏览器内运行&#xff0c; 提供前端JavaScirpt二次开发接口。官方下载地址&#xff1a;Rembg.js图片去背景开发包 。 1、目录组织 Rembg.js开发包的目录组织说明如下&#xff1a; rembg …

RocketMQ源码分析 - 环境搭建

RocketMQ源码分析 - 环境搭建 环境搭建源码拉取导入IDEA调试1) 启动NameServer2) 启动Broker3) 发送消息4) 消费消息 环境搭建 依赖工具 JDK&#xff1a;1.8MavenIntellij IDEA 源码拉取 从官方仓库 https://github.com/apache/rocketmq clone或者download源码。 源码目录…

【题目/训练】:双指针

引言 我们已经在这篇博客【算法/学习】双指针-CSDN博客里面讲了双指针、二分等的相关知识。 现在我们来做一些训练吧 经典例题 1. 移动零 思路&#xff1a; 使用 0 当做这个中间点&#xff0c;把不等于 0(注意题目没说不能有负数)的放到中间点的左边&#xff0c;等于 0 的…

基于java的酒店管理系统设计与实现

系统分析与设计 需求分析 1.系统概要 根据餐饮系统的流程&#xff0c;完成从用户登录到开台点菜&#xff0c;到结账收银&#xff0c;到统计一条线的信息化管理&#xff0c;因此整个餐饮管理信息系统的研发内容就是开发一整套餐饮管理信息系统&#xff0c;实现餐饮业务的计算…

【Vue3】集成 Element Plus

【Vue3】集成 Element Plus 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

后端开发刷题 | 合并两个排序的链表

描述 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围&#xff1a; 0≤n≤1000&#xff0c;−1000≤节点值≤1000 如输入{1,3,5},{2,4,6}时&#xff0c;合并后的链表为{1,2,3,4,5,6}&#xff0c;…

MySQL各个版本root账号没有最高权限的解决方法

一、详细报错 ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 报错原因&#xff08;分析过程&#xff09;&#xff1a; rootlocalhost用户密码修改导致 解决方法&#xff1a; 跳过权限验证启动数据库&#xff0c;并修改密码。如下…

怎么快速定位bug?如何编写测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在…

独立站PrestaShop安装

独立站PrestaShop安装 独立站PrestaShop安装系统需求下载PrestaShop浏览器下载命令行下载 解压PrestaShop创建数据库移动PrestaShop源码到web目录composer安装依赖包nginx配置访问域名进入安装页面选择语言许可协议系统兼容性店铺信息Content of your store系统配置数据库店铺安…

数据结构day03(栈 Stack 顺序栈、链式栈 )内含具体详细代码实现

目录 【1】栈 Stack 1》栈的定义 2》顺序栈 2》链式栈 4》顺序栈的链式栈的区别 【1】栈 Stack 1》栈的定义 栈&#xff1a;是只允许在一端进行插入或删除的线性表&#xff0c;首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&…

仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框

ContentLoadingProgressBar 是 Android 中的一个控件&#xff0c;继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能&#xff0c;主要用于在加载内容时显示进度。它的一些主要特点如下&#xff1a; 自动隐藏和显示&#xff1a;ContentLoadingProgressBar 会在…

JavaScript_7_练习:随机抽奖案例

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>练习&#xff1a;随机抽奖案例</tit…

vue项目配置基础路由vue-router

1、运行以下命令安装vue-router yarn add vue-router 2、在src目录下的components中新建两个vue页面 3、在src目录下新建router文件夹&#xff0c;在router文件夹下面新建index.js文件 4、配置main.js文件 //引入Vue import Vue from "vue"; //引入App import App…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了&#xff0c;今天微软发布 Windows 11 Canary 新版本&#xff0c;此次版本号已经转移到 Build 27xxx&#xff0c;首发版本为 Build 27686 版。 此次更新带来了多项改进&#xff0c;包括 Windows Sandbox 沙盒功能切换到 Microsof…