Chrome插件:微信公众号自动登录(chrome.extension)
manifest.json:
{
"manifest_version": 2,
"name": "WX.AutoLogin",
"version": "1.0.0",
"description": "微信公众号自动登录系统",
"icons": {
"16": "img/icon.png",
"48": "img/icon.png",
"128": "img/icon.png"
},
"browser_action": {
"default_icon": "img/icon.png",
"default_title": "微信公众号自动登录系统",
"default_popup": "popup.html"
},
"permissions": [
"cookies",
"storage",
"tabs",
"*://mp.weixin.qq.com/*"
],
"background": {
"scripts": ["js/background.js"]
},
"content_scripts": [{
"matches": ["*://mp.weixin.qq.com/*"],
// 多个JS按顺序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// 代码注入的时间,可选值: "document_start", "document_end", or "document_idle",最后一个表示页面空闲时,默认document_idle
"run_at": "document_start"
}]
}
popup.js:
function msg(msg) {
layer.msg(msg, {offset: 0, shift:6});
} $(document).ready(function(){
chrome.storage.local.get(null, function (items) {
console.log('items:', items);
for (var key in items) {
if (key == '__names') {
continue;
}
$('#accountBtnArea').append('\
<div class="button-row" data-user="'+items[key].user+'">\
<button class="account-btn"> '+items[key].name+'</button>\
<div class="icon-container delete-acct"><i class="fa fa-trash"></i></div>\
</div>');
}
}); $('#showAddBtn').click(function(event) {
$('.button-area').hide();
$('.add-area').show();
$('.acct-input').val('');
});
$('#cancelBtn').click(function(event) {
$('.button-area').show();
$('.add-area').hide();
});
$('#confirmBtn').click(function(event) {
var name = $('#accountName').val();
var user = $('#account').val();
var pwd = $('#password').val();
if (!name || !user || !pwd) {
msg('请填入信息!');
return;
}
if (name == '__names') {
msg('该名字不允许使用!');
return;
}
chrome.storage.local.get([user, '__names'], function(result) {
if (result[user]) {
msg('该用户已存在,请删除后再添加');
return;
}
if (result.__names && result.__names[name]) {
msg('您已经有该名字了,请换个名字吧!');
return;
}
if (!result.__names) {
result.__names = {};
}
$('#accountBtnArea').append('\
<div class="button-row" data-user="'+user+'">\
<button class="account-btn">'+name+'</button>\
<div class="icon-container delete-acct"><i class="fa fa-trash"></i></div>\
</div>');
$('.button-area').show();
$('.add-area').hide();
var saveObj = {};
saveObj[user] = {
user: user,
pwd: md5(pwd),
name: name
}
result.__names[name] = '';
saveObj['__names'] = result.__names;
chrome.storage.local.set(saveObj);
});
});
$('body').on('click', '.delete-acct', function(event) {
$(this).closest('.button-row').remove();
var user = $(this).closest('.button-row').attr('data-user');
chrome.storage.local.remove(user);
chrome.storage.local.get([user, '__names'], function(result) {
delete result.__names[user];
chrome.storage.local.set({__names: result.__names});
});
});
$('body').on('click', '.button-row', function(event) {
var bg = chrome.extension.getBackgroundPage();
bg.start($(this).data('user'));
});
});
background.js:
var userStor; function removeAllCookies(cookies) {
cookies.forEach(function(cookie, index) {
chrome.cookies.remove({
'url':'https://mp.weixin.qq.com',
'name': cookie.name
});
})
} function start(user) {
chrome.storage.local.get([user], function(result) {
if (result && result[user] && result[user].user && result[user].pwd) {
userStor = result[user];
var time = Date.now()/1000|0;
if (!userStor.cookies || time >= userStor.expire_time) { // 超时,需重新登陆
chrome.cookies.getAll({url: 'https://mp.weixin.qq.com/'}, function (cookies) {
removeAllCookies(cookies);
chrome.tabs.create({'url': 'https://mp.weixin.qq.com/#login'});
});
return;
}
// 没有超时,直接设置cookie登陆
chrome.cookies.getAll({url: 'https://mp.weixin.qq.com/'}, function (cookies) {
removeAllCookies(cookies);
userStor.cookies.forEach(function(cookie, index) {
delete cookie.hostOnly;
delete cookie.session;
cookie.url = 'https://mp.weixin.qq.com/';
chrome.cookies.set(cookie);
});
// console.log('成功登陆公众号,准备跳转...')
// chrome.tabs.create({'url': 'https://mp.weixin.qq.com/'});
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
if (tabs[0].url.startsWith('https://mp.weixin.qq.com') && tabs[0].id) { // 该页面直接跳转
chrome.tabs.sendMessage(tabs[0].id, {cmd:'jump_url', url:'https://mp.weixin.qq.com/'});
} else {
chrome.tabs.create({'url': 'https://mp.weixin.qq.com/'});
}
});
});
} else {
console.log('请先添加账号!');
}
});
} // 监听来自content-script的消息
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.type == 'login_success') {
chrome.cookies.getAll({url: 'https://mp.weixin.qq.com/'}, function (cookies) {
userStor.token = request.token;
userStor.cookies = cookies;
var time = Date.now()/1000|0;
userStor.expire_time = time + 12*3600 - 60;
var saveObj = {};
saveObj[request.user] = userStor;
chrome.storage.local.set(saveObj);
chrome.tabs.sendMessage(request.tabId, {cmd:'jump_url', url:'https://mp.weixin.qq.com/'});
});
} else if (request.type == 'content_js_start') {
if ('https://mp.weixin.qq.com/#login' == request.url) { // 创建重新登录页面返回的消息
chrome.tabs.sendMessage(sender.tab['id'], {cmd:'show_qrcode', user:userStor.user, pwd:userStor.pwd, tabId: sender.tab['id']});
}
}
});
content-script.js:
function loginWx(user, tabId) {
var url = 'https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1';
(function wxAsk() {
$.get(url, function(data, status, xhr) {
if (data.ret) {
console.log(data)
return;
}
switch (data.status) {
case 1:
if (1 == data.user_category) {
url = "https://mp.weixin.qq.com/cgi-bin/loginauth?action=ask&token=&lang=zh_CN&f=json&ajax=1";
} else {
$.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login&lang=zh_CN', {
userlang: 'zh_CN',
token: '',
lang: 'zh_CN',
f: 'json',
ajax: '1',
}, function(data, textStatus, xhr) {
if (data.base_resp && !data.base_resp.ret) {
$('#__gzh-saomiao-status').text('登录成功!');
var token = data.redirect_url.replace(/.*token=/g, '');
chrome.runtime.sendMessage({type: 'login_success', token: token, user: user, tabId: tabId});
}
});
return;
}
break;
case 2: $('#__gzh-saomiao-status').text('管理员拒绝!'); return;
case 3: $('#__gzh-saomiao-status').text('登录超时!'); return;
case 4: $('#__gzh-saomiao-status').text('扫描成功,等待确认...'); break;
default: $('#__gzh-saomiao-status').text('等待扫描...'); break;
}
setTimeout(function() { wxAsk(); }, 1000);
});
})();
} function start(user, pwd, tabId) {
$.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin', {
username: user,
pwd: pwd,
imgcode: '',
f: 'json',
userlang: 'zh_CN',
token: '',
lang: 'zh_CN',
ajax: '1'
}, function(data, status, xhr) {
if (!data || !data.base_resp || data.base_resp.ret) {
alert('用户名或密码错误!');
console.log(data);
return;
}
$('body').append('\
<script>loginWx("'+user+'", '+tabId+');</script>\
<div style="width: 100%; text-align: center; position: absolute; top: 20%; background: none; z-index: 999; ">\
<div style="width: 20%; text-align: center; background: #389a20a3; padding: 31px; margin: 0 auto;">\
<h1 style="color: #e4f31f;">请扫描二维码</h1><br>\
<img src="https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=getqrcode¶m=4300&rd='+Math.floor(1e3 * Math.random())+'" style="width:100%;">\
<br><br><h1 id="__gzh-saomiao-status" style="color: #e4f31f;">等待扫描...</h1>\
</div>\
</div>\
<div style="position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: rgba(0,0,0,.8); "></div>\
');
});
} // 监听来自background-script的消息
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
// console.log(['get msg from background', request]);
if(request.cmd == 'show_qrcode') {
// sendResponse('content js has get msg');
start(request.user, request.pwd, request.tabId);
} else if (request.cmd == 'jump_url') {
window.location.href = request.url;
}
}); // 发送消息给background js
chrome.runtime.sendMessage({type: 'content_js_start', url: window.location.href});
Chrome插件:微信公众号自动登录(chrome.extension)的更多相关文章
- 【tp5.1】微信公众号授权登录及获取信息录入数据库
微信公众号开发文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 微信公众号授权登录分为两种: 1.以 ...
- 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题
开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...
- 微信公众号授权登录,提示“redirect_uri 参数错误”
做微信公众号开发授权登录的时候遇到的坑... 后台服务用node,index.js相关代码如下: const oauth = new OAuth(conf.appid, conf.appsecret) ...
- 微信公众号授权登录后报redirect_uri参数错误的问题
在进行微信公众号二次开发的时候,需要通过授权码模式来进行微信授权.比如,在进行登录的时候,用户点击了登录按钮,然后弹出一个授权框,用户点击同意后,就可以获取用户的OpenId等信息了.这篇文章主要 ...
- uniapp - 微信公众号授权登录
[缘由] 采用uniapp进行微信小程序和微信公众号双版本开发:考虑到用户唯一性,我们后端确定了以“unionid”.作为唯一标识. 有的小伙伴估计也是刚入这坑,我就简单说一下步骤流程 [摸索] ...
- 开发Chrome插件,实现网站自动登录
近期被一个事情困扰着,我们采购了一款软件,里面有一个数据大屏页,当登录过期后,数据就会保持原状,不再更新.和供应商反馈了很多次,都无法彻底解决数据显示的问题,没办法,自己周末在家研究,网站自动登录的事 ...
- 实现微信公众号自动登陆自己的Web App
测试: 基本的思路是通过公众号OAuth API获取用户微信的openid.第一次使用的时候让用户登录,然后在数据库里把openid和自己应用的userid对应起来.以后获得用户的openid之后就可 ...
- 微信授权登录-微信公众号和PC端网站
https://blog.csdn.net/qq_34664239/article/details/79107529 一.微信公众号授权登录——微信公众平台 微信授权登录,并调用后台接口,获取用户信息 ...
- 微信公众号开发(5)---使用开源组件开发公众号OAuth2.0网页授权授权登录
搞清微信公众号授权登录的步骤步骤,我们的开发就完成了一大步 献上github 地址: https://github.com/Wechat-Group/weixin-java-tools/wiki/MP ...
随机推荐
- bzoj 3470: Freda’s Walk【拓扑排序+期望dp】
dfs会T,只好正反两遍拓扑了-- #include<iostream> #include<cstdio> #include<queue> #include< ...
- 【练习】Java实现的杨辉三角形控制台输出
import java.util.Scanner; /** * YangHui_tst01 * @author HmLy * @version 000 * - - - - - - - * 练习代码.( ...
- [POI2008]BLO-Blockade 【无向图tarjan/鸽点】By cellur925
题目传送门 lyd无向图tarjan的例题. 一句话题意(不得不佩服lyd老师的高度概括能力):在一张无向连通图上,求出每个点被破坏(去掉与这个点相关的所有边,不去掉这个点)后,无向图中使i,j不连通 ...
- Ubuntu 下Python和pip的版本
首先python只是个指向特定版本的软链接,具体指向那个是可以我们自己设置的, 而在Ubuntu中默认是指向python2的,并且python2其实也是个指向特定版本的软链接 所以我们要做的就是删除这 ...
- Taro 小程序 自定义导航栏
在小程序中,有的页面需求可能需要我们做一个自定义的导航栏, 今天就来踩一踩坑 首先需要在app.js 中给全局的导航栏隐藏, // app.js window: { navigationStyle: ...
- ios开发-常见的项目文件介绍
一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要用来放依赖的框架 3.test文件夹是 ...
- maven-将依赖的 jar包一起打包到项目 jar 包中
前言: 有时候在项目开发中,需要很多依赖的 jar 包,其中依赖的 jar 包也会依赖其他的 jar 包,导致jar 包的管理很容易不全,以下有两种方法可以规避这个问题. 一.在pom.xml 文件中 ...
- XML 基础学习
在w3school看到了XML的教程,想到以前工作学习中也接触到了XML,但只是简单搜索了解了下,没有认真去学习XML的基础,所以现在认真看下其基础部分,并写篇博客作为笔记记录下. XML 简介 XM ...
- 数据结构 - 顺序队列的实行(C语言)
数据结构-顺序队列的实现 1 顺序队列的定义 线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看队列的顺序存储结构. 队列的顺序储存结构:用数组存储队列,为了避 ...
- 水题 Codeforces Round #308 (Div. 2) A. Vanya and Table
题目传送门 /* 水题:读懂题目就能做 */ #include <cstdio> #include <iostream> #include <algorithm> ...