微信公众号 自动拉黑已经取关的用户

公众号是可以把用户加黑名单的,拉黑后用户就不会收到公众号的任何消息。

至于为什么要拉黑用户?

我自己的需求是防止被薅羊毛。

 

所以花了一点时间,自动拉黑已经取关的用户。

实现主要是基于公众号的API:

1、获取Accesstoken:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

2、拉黑用户:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Manage_blacklist.html

 

还有一点,因为公众号后台是看不到取关用户的,所以我是在微擎上绑定自己的公众号,然后别人取关后会存在数据库中,我直接通过读取数据库,来获取取关用户的openid,然后调用公众号接口去拉黑用户。

所以完整的步骤有以下:

(1)在微擎上绑定自己的公众号

(2)写代码去自动拉黑

 

下面介绍一下拉黑的流程:

import requests
import pymysql
import time

#1、获取access_token
access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=【填公众号的appid】&secret=【填secret】"

#为了简单理解,这里把相关的错误处理都删除了,只留能跑通的核心代码
access = requests.get(access_url)
access = eval(access.text)
access_token = access["access_token"]

#2、自动拉黑用户
openid_list = ["openid1","openid2","openid3"] #填用户的openid,最多20个用户
url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchblacklist?access_token=" + access_token
data = {
    "openid_list": openid_list
}
req = requests.post(url, json=data)

if req.status_code == 200:
    req = req.text
    req = eval(req)
    if req["errcode"] == 0:
        print("拉黑成功")
    elif req["errcode"] == 40001 or req["errcode"] == 42001:
        print("access_token已过期")

 

再介绍一下如何获取取关用户的openid

import pymysql

global CURSOR
global CONN
#填数据库信息
HOST = ""
PORT = 3306
USER = ""
PASSWD = ""
DB = ""

#数据库登录
def DbLogin():
    try:
        global CONN
        CONN = pymysql.connect(host=HOST, port=PORT, user=USER, passwd=PASSWD, db=DB, charset='utf8')
    except pymysql.OperationalError:
        #连接失败
        print("error3: 数据库连接失败!")
        return False
    else:
        global CURSOR
        CURSOR = CONN.cursor()
    return True

#选择取关用户的列表
def SelectAllData():
    if DbLogin():
        try:
            global CURSOR
            #SQL代码
            fans_id = 0
            sql = "SELECT * FROM `ims_mc_mapping_fans` WHERE `follow` = 0 AND acid = 5 AND fanid > " + fans_id
            CURSOR.execute(sql)
            unfollow_list = CURSOR.fetchall()
            CURSOR.close()
            return unfollow_list
        except Exception as e:
            CONN.rollback()
            print(e)
            return []
    else:
        print("请检查网络连接!")
        return []

unfollow_list = SelectAllData()
openid_list = []

k = 0 #因为微信接口限制,只能一次拉黑20个,所以这里做个统计
for i in range(len(unfollow_list)):
    fans_id = unfollow_list[i][0]
    openid_list.append(unfollow_list[i][4])
    k += 1
    if k == 20:
        state = Block(access_token, openid_list) #拉黑用户,Block是自己写的拉黑函数,可参考拉黑流程里的第2步
        
if len(openid_list) > 0:
    state = Block(access_token, openid_list) #如果不够20个,再拉黑一次

 

提示一下,运行代码之前要把为微擎的域名设置到公众号的网页授权,JS授权里面。

 

最后,如果有相关的业务需求,也可以直接联系我。

v:1316873445

你可能感兴趣的:(微信公众号,mysql,公众号,拉黑)