扇贝网是一个非常棒的英语学习网站,大家还可以加入一些小组,一起交流学习、共同进步。但是,小组管理起来非常辛苦,尤其是在0点前踢出不打卡的成员,因此考虑利用程序来实现小组查卡自动化。

登录

操作 扇贝网登录
URL http://www.shanbay.com/accounts/login/
方式 POST
数据 csrfmiddlewaretoken CSRF令牌
username 用户名
password 密码

CSRF令牌存在于Cookie中,我们需要先以GET方式访问该URL,就能取到CSRF令牌了。

# -*- coding: utf-8 -*-
import requests class Shanbay(): def __init__(self, username, password):
self.request = requests.Session()
self.username = username
self.password = password def login(self):
url = 'http://www.shanbay.com/accounts/login/'
r = self.request.get(url)
csrftoken = r.cookies['csrftoken']
data = {
'csrfmiddlewaretoken': csrftoken,
'username': self.username,
'password': self.password,
}
return self.request.post(url, data=data).ok

成员管理

如果我们获取小组管理后台所有组员的信息,比较费时间。考虑实际需求,不妨仅获取当天未打卡的组员的信息,这样能大大提高查卡效率。

踢人需要data-id,这个在小组管理后台页面就能获取到。但是,如果我们想发站内短信,就需要username,而username在小组管理后台页面里是没有的,这个需要查看个人打卡日记。

从个人打卡日记不仅能看到username,还能看到该贝友入组后最近已连续有多少天未打卡(这往往也是组规限定的内容)等等。

 操作 踢人 
 URL http://www.shanbay.com/api/v1/team/member/ 
 方式 PUT 
 数据  action  动作('dispel')
ids data-id
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
from Journal import Journal
import re class Domain(): def __init__(self, shanbay):
self.shanbay = shanbay
self.request = shanbay.request def get_not_checked_members(self):
'''
data_id : 踢人时需要data_id
role : 身份标识
nickname : 昵称
user_id : 发短信时需要user_id
username : 用户名
points : 贡献值
days : 组龄
rate : 打卡率
checked_yesterday: 昨天是否打卡
checked : 今天是否打卡
off_dyas : 入组后最近连续未打卡天数
'''
members = []
for page in range(1, 48):
html = self.request.get('http://www.shanbay.com/team/manage/?t=checkin_today&page=%d' % page).text
soup = BeautifulSoup(html, 'html5lib')
for member in soup.find_all('tr', class_='member'):
checked = member.find_all(class_='checked')[1].find('span').text.strip() == '已打卡'
if checked:
break
days = int(member.find(class_='days').text)
user_id = re.findall('\d+', member.find(class_='user').find('a')['href'])[0]
user = Journal(shanbay=self.shanbay, user_id=user_id)
checked_yesterday = member.find_all(class_='checked')[0].find('span').text.strip() == '已打卡'
if checked_yesterday:
off_days = 1
else:
off_days = user.get_off_days(days)
data = {
'data_id':member['data-id'],
'role':member['role'],
'nickname':member.find(class_='user').find('a').text,
'user_id':user_id,
'username':user.get_username(),
'points':int(member.find(class_='points').text),
'days':days,
'rate':float(member.find(class_='rate').find('span').text[:-2]),
'checked_yesterday':checked_yesterday,
'checked':checked,
'off_dyas':off_days
}
members.append(data)
else:
continue
break
return members def dismiss(self, data_ids):
url = 'http://www.shanbay.com/api/v1/team/member/'
data = {
'action': 'dispel',
}
data['ids'] = ','.join(map(str, data_ids))
r = self.request.put(url, data=data)
return r.json()['msg'] == "SUCCESS"

(这里用到了Python跳出两层循环的技巧*^_^*)

打卡日记

通过打卡日记,我们可以获得一些基本信息,例如:用户名、最近连续未打卡天数等。

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import re
import datetime
import time class Journal(): def __init__(self, shanbay, user_id):
self.shanbay = shanbay
self.request = shanbay.request
self.user_id = user_id
self.soup = self.__get_journal_soup() def __get_journal_soup(self):
html = self.request.get('http://www.shanbay.com/checkin/user/%s/' % self.user_id).text
return BeautifulSoup(html) def get_username(self):
return re.findall(u'(\w+)\s*的日记', self.soup.find_all(class_='page-header')[0].find('h2').text)[0] def get_off_days(self, days=0):
pass

站内短信

操作 发送站内短信 
URL http://www.shanbay.com/api/v1/message/ 
方式 POST 
数据 recipient 收件人(username)
subject 标题
body 内容
csrfmiddlewaretoken CSRF令牌
# -*- coding: utf-8 -*-

class Message():

    def __init__(self, shanbay):
self.shanbay = shanbay
self.request = shanbay.request def send_msg(self,recipient, subject, body):
url = 'http://www.shanbay.com/api/v1/message/'
data = {
'recipient': recipient,
'subject': subject,
'body': body,
'csrfmiddlewaretoken': self.request.cookies['csrftoken']
}
return self.request.post(url, data=data).ok

小组管理

操作 设定加组条件
URL http://www.shanbay.com/team/setqualification/{team_id}
方式 POST
数据 value 天数
kind 类型
condition 条件
team 小组id
csrfmiddlewaretoken CSRF令牌

若需要在小组发帖或回帖,需要forum_id而不是小组id,而forum_id可以通过小组主页找到。

操作 发帖
URL http://www.shanbay.com/api/v1/forum/{forum_id}/thread/
方式 post
数据 title 标题
body 内容
csrfmiddlewaretoken CSRF令牌
操作 回帖
URL http://www.shanbay.com/api/v1/forum/thread/{post_id}/post/
方式 POST
数据 body 内容
csrfmiddlewaretoken CSRF令牌
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup class Team(): def __init__(self, shanbay, team_id):
self.shanbay = shanbay
self.request = shanbay.request
self.team_id = team_id
self.forum_id = self.__get_forum_id() def set_join_limit(self, days, kind=2, condition='>='):
url = 'http://www.shanbay.com/team/setqualification/%s' % self.team_id
data = {
'value': days,
'kind': kind,
'condition': condition,
'team': self.team_id,
'csrfmiddlewaretoken': self.request.cookies['csrftoken']
}
r = self.request.post(url, data=data)
return 'http://www.shanbay.com/referral/invite/?kind=team' == r.url def __get_forum_id(self):
html = self.request.get('http://www.shanbay.com/team/detail/%s/' % str(self.teamId)).text
soup = BeautifulSoup(html)
return soup.find(id='forum_id')['value'] def new_post(self, title, content):
url = 'http://www.shanbay.com/api/v1/forum/%s/thread/' % self.forum_id
data = {
'title': title,
'body': content,
'csrfmiddlewaretoken': self.request.cookies['csrftoken']
}
return self.request.post(url, data=data).json() def reply_post(self, post_id, content):
url = 'http://www.shanbay.com/api/v1/forum/thread/%s/post/' % post_id
data = {
'body': content,
'csrfmiddlewaretoken': self.request.cookies.get('csrftoken')
}
return self.request.post(url, data=data).json()

Python项目:扇贝网小组查卡助手的更多相关文章

  1. Jenkins部署Python项目实战

    一.背景 我们工作中常用Jenkins部署Java代码,因其灵活的插件特性,例如jdk,maven,ant等使得java项目编译后上线部署一气呵成,同样对于脚本语言类型如Python上线部署,利用Je ...

  2. 做中学(Learning by Doing)之背单词-扇贝网推荐

    做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...

  3. 以正确的方式开源 Python 项目

    以正确的方式开源 Python 项目 大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清 晰和无痛.我不是 ...

  4. 创建成功的Python项目

    创建成功的Python项目 前端开发工具技巧介绍—Sublime篇 SEO在网页制作中的应用 观察者模式 使用D3制作图表 英文原文:Create successful Python projects ...

  5. 以正确的方式开源 Python 项目(转)

    大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛.我不是简单的指——“创建一个GitHub库,提 ...

  6. Python教程百度网盘哪里有?

    Python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象地称作"内置电池(batteries included)".带你快速入门的Py ...

  7. python爬虫实例--网易云音乐排行榜爬虫

    网易云音乐,以前是有个api 链接的json下载的,现在没了, 只有音乐id,title , 只能看播放请求了, 但是播放请求都是加密的值,好坑... 进过各种努力, 终于找到了个大神写的博客,3.6 ...

  8. python项目开发视频

    精品Python项目开发学习视频 所属网站分类: 资源下载 > python视频教程 作者:乐天派 链接:http://www.pythonheidong.com/blog/article/44 ...

  9. Docker如何部署Python项目

    Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...

随机推荐

  1. 循序渐进Python3(八) -- 0 -- 初识socket

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  2. 【Python全栈笔记】07 [模块二] 20 Oct 冒泡排序

    给出一个列表,进行冒泡排序 原理算法: li = [52, 37, 23, 11, 3, 1, ] print(li) # 每次循环,进行一次排序,列表内数字两两比较,最大的数字排到最末尾 # 一共循 ...

  3. 完整地mybatis + springmvc用checkbox实现批量删除

    因为自己在网上找了半天,都找不到完整地代码(脑袋笨,不会变通到自己项目里),所以在这里记下了近乎完整的代码 前端代码 <span style="cursor:pointer;" ...

  4. XmlDocument解析Soap格式文件案例:

    private static string Analysis(string strResult) { var doc = new System.Xml.XmlDocument(); //加载soap文 ...

  5. openvpn安装

    1,wget http://swupdate.openvpn.org/as/openvpn-as-2.0.10-CentOS7.x86_64.rpm 2,passwd openvpn

  6. 无法更新 EntitySet“SoreInfo_Table”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。

    无法更新 EntitySet"SoreInfo_Table",因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> ...

  7. JavaScript 详说事件机制之冒泡、捕获、传播、委托

    DOM事件流(event  flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(event  capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会 ...

  8. 记录第一次搭建svn服务器

    搭建svn服务器需要另外的软件, 在此以32位的为例: 安装过程非常简单, 一直下一步下一步确定就好了, svn安装完毕再安装中文语言包, 安装完成后可以在设置里面找到中文简体选择就OK了 主要记录一 ...

  9. linux driver编译环境搭建和命令

    首先将ubuntu14.04的内核升级到内核3.18.12. 其次,Ubuntu14.04上驱动编译命令 $ sudo make -C ~/linux-3.18.12/ M=`pwd` modules ...

  10. Ajax用法总结

    ajax:      AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.      AJAX ...