文档章节

微信web常用接口

huang_hsl
 huang_hsl
发布于 2017/05/03 10:52
字数 688
阅读 376
收藏 0

因为项目需要,我用python研究了基于http的微信接口。

其实,常用的接口,各大社区和论坛都有详细的介绍和说明了,在这些有不提了。

我说下,发送图片的功能。

首先,发送图片的思想是,先把图片上传到微信服务器上,服务器返回MediaId,接着调发送信息接口。

详细:

    1.图片上传到微信服务器:

    url:https://file2.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json

    python代码:

# 上传图片到微信服务器上
def webwxuploadmedia(image_name,cookie):
    global media_count
    # print('-----cookie------->>'+cookie)
    url = 'https://file2.wx.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json'
    # 计数器
    media_count = media_count + 1
    # 文件名
    file_name = image_name
    # MIME格式
    # mime_type = application/pdf, image/jpeg, image/png, etc.
    mime_type = mimetypes.guess_type(image_name, strict=False)[0]
    # 微信识别的文档格式,微信服务器应该只支持两种类型的格式。pic和doc
    # pic格式,直接显示。doc格式则显示为文件。
    media_type = 'pic' if mime_type.split('/')[0] == 'image' else 'doc'
    # 上一次修改日期
    lastModifieDate = 'Thu Mar 17 2017 00:55:10 GMT+0800 (CST)'
    # 文件大小
    file_size = os.path.getsize(file_name)
    # PassTicket
    # pass_ticket = pass_ticket
    # clientMediaId
    client_media_id = str(int(time.time() * 1000)) + \
        str(random.random())[:5].replace('.', '')
    # webwx_data_ticket
    webwx_data_ticket = ''
    # for item in cookie:
    #     if item.name == 'webwx_data_ticket':
    #         webwx_data_ticket = item.value
    #         break
    # if (webwx_data_ticket == ''):
    #     return "None Fuck Cookie"

    uploadmediarequest = json.dumps({
        "BaseRequest": BaseRequest,
        "ClientMediaId": client_media_id,
        "TotalLen": file_size,
        "StartPos": 0,
        "DataLen": file_size,
        "MediaType": 4
    }, ensure_ascii=False).encode('utf8')

    multipart_encoder = MultipartEncoder(
        fields={
            'id': 'WU_FILE_' + str(media_count),
            'name': file_name,
            'type': mime_type,
            'lastModifieDate': lastModifieDate,
            'size': str(file_size),
            'mediatype': media_type,
            'uploadmediarequest': uploadmediarequest,
            'webwx_data_ticket': webwx_data_ticket,
            'pass_ticket': pass_ticket,
            'filename': (file_name, open(file_name, 'rb'), mime_type.split('/')[1])
        },
        boundary='-----------------------------1575017231431605357584454111'
    )

    headers = {
        'Host': 'file2.wx.qq.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate',
        'Referer': 'https://wx2.qq.com/',
        'Content-Type': multipart_encoder.content_type,
        'Origin': 'https://wx2.qq.com',
        'Connection': 'keep-alive',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache'
    }

    r = requests.post(url, data=multipart_encoder, headers=headers)
    # r = urllib.request.Request(url, data=multipart_encoder, headers=headers)
    response_json = r.json()
    if response_json['BaseResponse']['Ret'] == 0:
        return response_json
    return None

参数说明:

   cookie:http.cookiejar.CookieJar()

    BaseRequest: {
        'Uin': int(wxuin),
        'Sid': wxsid,
        'Skey': skey,
        'DeviceID': deviceId,
    }

 

返回数据:

{
"BaseResponse": {
"Ret": 1,
"ErrMsg": ""
}
,
"MediaId": "XXXXXXXXXXXXXXXXXXXX看起来想乱码的东西",
"StartPos": 13243,
"CDNThumbImgHeight": 34,
"CDNThumbImgWidth": 42
}

2.发送图片

# 发送图片
def webwxsendmsgimg(MyUserName, ToUserName, media_id):
    url = 'https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsgimg?fun=async&f=json&pass_ticket=%s' % (pass_ticket)
    clientMsgId = str(int(time.time() * 1000)) + \
            str(random.random())[:5].replace('.', '')
    data_json = {
        "BaseRequest": BaseRequest,
        "Msg": {
            "Type": 3,
            "MediaId": media_id,
            "FromUserName": MyUserName,
            "ToUserName": ToUserName,
            "LocalID": clientMsgId,
            "ClientMsgId": clientMsgId
        }
    }
    headers = {'content-type': 'application/json; charset=UTF-8'}
    data = json.dumps(data_json, ensure_ascii=False).encode('utf8')
    r = urllib.request.Request(url, data=data, headers=headers)
    # r = requests.post(url, data=data, headers=headers)
    dic = r.json()
    return dic['BaseResponse']['Ret'] == 0

参数说明:

   media_id:上传图片成功返回的数据

    BaseRequest: {
        'Uin': int(wxuin),
        'Sid': wxsid,
        'Skey': skey,
        'DeviceID': deviceId,
    }

     先看,获取好友列表返回的一条数据:

{'PYQuanPin': 'test22', 'EncryChatRoomId': '', 'KeyWord': '', 'ChatRoomId': 0, 'MemberList': [], 'Sex': 0, 'City': '', 'OwnerUin': 0, 'SnsFlag': 0, 'Uin': 0, 'Province': '', 'HideInputBarFlag': 0, 'StarFriend': 0, 'AttrStatus': 0, 'Alias': '', 'Statues': 1, 'Signature': '', 'MemberCount': 0, 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=657299195&username=@@af75b2f842c9805c8263ebed075e0623d5113d0e1790ea7a2663992220de03fe&skey=@crypt_5dd98d25_c7d4661fb1a13d196200f0eab0e004ee', 'NickName': 'test22', 'UserName': '@@af75b2f842c9805c8263ebed075e0623d5113d0e1790ea7a2663992220de03fe', 'PYInitial': 'TEST22', 'UniFriend': 0, 'RemarkPYQuanPin': '', 'IsOwner': 1, 'RemarkName': '', 'VerifyFlag': 0, 'AppAccountFlag': 0, 'RemarkPYInitial': '', 'DisplayName': '', 'ContactFlag': 3}
 

    MyUserName:这里的参数MyUserName是自己信息中的'UserName'

    ToUserName:ToUserName你要发送好友信息中的'UserName'

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
huang_hsl
粉丝 0
博文 9
码字总数 2713
作品 0
武汉
程序员
私信 提问
Java 微信公众号 MVC 开发框架--jwx

jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。 目的主要有两个,其一生封装微信请求xml消息为java实体对象...

落叶走天涯
2017/03/28
1K
0
微信公众平台开发系列之必备知识

一、微信公众号开发需要准备的一些资料以及如何搭建一个测试服务器 微信公众号开发之前,首先要有一个公众号,不同类型的公众号具备不同的接口权限。 可以看到,如果想使用微信的很多高级接口...

充电实践
2018/07/07
0
0
微信小程序来了 WebApp还会远吗

应用号以“微信公众平台小程序”的名义进行内测发布,核心功能是提供一些本地的API供H5上面的js调用,以此提升微信上H5应用的流畅度。 从内测信息来看,小程序在通过向开发者开放多种服务及支...

sami
2016/09/22
1K
9
整合微信小程序的Web API接口层的架构设计

在我前面有很多篇随笔介绍了Web API 接口层的架构设计,以及对微信公众号、企业号、小程序等模块的分类划分。例如在《C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系》介绍了相...

walb呀
2017/12/04
0
0
C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统、微信应用、微信小程序、APP等方面,都可以直接调用...

walb呀
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
2
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
2
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部