文档章节

微信web常用接口

huang_hsl
 huang_hsl
发布于 2017/05/03 10:52
字数 688
阅读 343
收藏 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
微信公众平台开发系列之必备知识

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

充电实践
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

咕泡-Factory设计模式笔记

个人感悟: 设计模式都是处理复杂问题的,如果问题本身很简单,使用设计模式反而累赘,增加了开发的复杂性 遇到最简单的情况,直接 new 如果创建对象的过程简单,但是需要匹配不同情况,返回...

职业搬砖20年
17分钟前
0
0
Java中的锁分类

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏...

Funcy1122
25分钟前
0
0
Ansible随机数

想为你的Ansible剧本取一个随机数?还想在接下来的运行中保持系统的等幂性?这里有一个答案。 假如,你要为一大批服务器设置cron任务,却不想让它们同时启动,你可以这样设置分钟数: minute...

大别阿郎
34分钟前
0
0
SpringCloud之服务注册中心Eureka

本系列介绍的配置均基于 Spring Boot 2.0.1.RELEASE 版本和 Spring Cloud Finchley.SR1 服务注册中心 Spring Cloud 已经帮我们实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。 ...

熊小飞呀
今天
7
1
“Comparison method violates ...”异常的再现方法

前提条件:JDK8 代码: import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class Test { public stat......

hunterli
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部