Comments (20)
先拜拜jiayi大神,以及现在人在金边没法扫微信/支付宝捐款,因为地域限制什么的。。。什么时候支持一波境外支付lol。
paypal.me/trinkle23897 不知道能不能用(
另外虽然人已经到柬埔寨了,但是没有成功预约上non-resident面签,想要写一个自动抢位的脚本,有几个技术问题想问一下(当然如果觉得会侵犯到你的知识产权请直接拒绝,我是完全理解的lol
- 我看到最新的PR #34 应该是已经更新了金边non-resident的选择,那么我是不是直接爬
https://tuixue.online/global/crawler/F/金边/2020/{MM}/{DD}
就可以了
是的
- 目前的思路是按照 /visa2/fast_visa.py 的代码来实现数据更新之后的自动预约,请问有没有什么坑要注意的呢...比如captcha.py里的神经网络我可以直接照搬来破解验证码么(没有找的feifei的api调用代码...可能是没看仔细?)
目前是前后端分离了,所有爬虫api和代码在api/
下面(包括ais的),不过fast_visa.py
是把这俩整合在一起的一个早先版本,差别也不是太大。
captcha.py是一个已经训练好的nn,可以直接调用,权重就在repo里面,准确率大概98%这样,不用额外调用什么打码平台了
然后预约的话好像登录之后直接访问 https://cgifederal.secure.force.com/scheduleappointment 之后post数据就好了,我没继续弄下去( 好像不是
- 本人还算精通React前端和python + requests/selenium 数据抓取,有没有什么feature需要添加的,我也想出份力lol
有……现在global的前端有点乱……我没什么时间重构,我的想法是按照各个region来划分,然后也做一个前后端分离的样子(于是就变成了一个后端专门爬虫(混淆ip用的,怕查过来),一个后端专门调用爬虫,一个前端fetch第二个后端的数据(雾
我其实并不会前端(真的是乱糊出来的,没有哪个前端会比我这个用python手动渲染的还php二次渲染更丑了
反正有个考虑就是能够支持大约1000的并发就行(指tuixue.online/visa/这个页面
from tuixue.online-visa.
然后预约的话好像登录之后直接访问 https://cgifederal.secure.force.com/scheduleappointment 之后post数据就好了,我没继续弄下去(好像不是
感觉每一个步骤都是一个post,不能摞起来一起吧,也不好拿自己的账号瞎测试啊生怕被冻结...
我其实并不会前端(真的是乱糊出来的,没有哪个前端会比我这个用python手动渲染的还php二次渲染更丑了
反正有个考虑就是能够支持大约1000的并发就行(指tuixue.online/visa/这个页面
有一说一我觉得目前的UI还可以 (而我并不会php,挺简洁的lol,唯一有点困惑的是“时间变前”和“时间变后”到底是什么意思。同意/global
可以重新设计一下,这两天我看看有时间可以试试搞一搞。
话说这个网站的nginx.conf是每一个route(/visa
、/visa2
、/global
)指向一个静态html文件吗
from tuixue.online-visa.
感觉每一个步骤都是一个post,不能摞起来一起吧,也不好拿自己的账号瞎测试啊生怕被冻结...
也还好,拿一个国内的试试就行
有一说一我觉得目前的UI还可以
(而我并不会php,挺简洁的lol,唯一有点困惑的是“时间变前”和“时间变后”到底是什么意思。同意/global
可以重新设计一下,这两天我看看有时间可以试试搞一搞。
可以不用php,ui主要都是bootstrap糊出来的
话说这个网站的nginx.conf是每一个route(
/visa
、/visa2
、/global
)指向一个静态html文件吗
直接访问对应文件夹下面的index.php,由template.php+那个notify.py生成的(所以很丑
from tuixue.online-visa.
大佬就是大佬...24/7秒回的吗lol
也还好,拿一个国内的试试就行
我看之前你在地里发了一个帖子claim这个网站来着,一下子找不到了,能给个reference吗。另外注册账号不需要护照信息这些吗
from tuixue.online-visa.
我看之前你在地里发了一个帖子claim这个网站来着,一下子找不到了,能给个reference吗。另外注册账号不需要护照信息这些吗
https://www.1point3acres.com/bbs/thread-622283-1-1.html
如果能发一个global的宣传贴就好了,大米啥无所谓,关键是地里的管理员老是删我帖子
随便填一个随机数就行
from tuixue.online-visa.
啊白天逛金边去健身房了,终于晚上能好好看代码
关于爬虫
目前是前后端分离了,所有爬虫api和代码在api/下面(包括ais的),不过fast_visa.py是把这俩整合在一起的一个早先版本,差别也不是太大。
captcha.py是一个已经训练好的nn,可以直接调用,权重就在repo里面,准确率大概98%这样,不用额外调用什么打码平台了
大佬我看/api/tuixue
目录下没有captcha.py
,倒是vcode2.py
里是有神经网络的代码,和/visa2
里的captcha.py
的神经网络代码不一样,看起来/api/tuixue/vcode2.py
就是直接把训练好的weights(/api/save.pth
)读进来直接用,然后训练是之前用/visa2/captcha.py
的代码跑的?那我直接参考/api
更方便的样子lol
另外一个比较重要的问题是,我自己的真实账户登陆cgi(大陆转柬埔寨)是侧边栏是没有显示"latest available appointment date"的信息的,但是我随机注册的新账户就有显示,大佬有遇到过这种情况吗...
关于global前端
对于前端有几个问题:
- 顶部的折线图是可视化的什么数据呢
- 底部的评论区不知道能不能整合进React,我明天睡醒看看他们的开发者文档
有……现在global的前端有点乱……我没什么时间重构,我的想法是按照各个region来划分
- 这里指的region是各大洲(欧洲|亚洲|南/北美)吗,然后需不需要按照签证类型和系统(cgi, ais, mx)也做相应的filter
明天补一个我目前意淫的networking flowchart,太困了现在...
from tuixue.online-visa.
大佬我看
/api/tuixue
目录下没有captcha.py
,倒是vcode2.py
里是有神经网络的代码,和/visa2
里的captcha.py
的神经网络代码不一样,看起来/api/tuixue/vcode2.py
就是直接把训练好的weights(/api/save.pth
)读进来直接用,然后训练是之前用/visa2/captcha.py
的代码跑的?那我直接参考/api
更方便的样子lol
这个应该是更好的nn,/visa2下面的nn准确率我记得只有70-90这样
另外一个比较重要的问题是,我自己的真实账户登陆cgi(大陆转柬埔寨)是侧边栏是没有显示"latest available appointment date"的信息的,但是我随机注册的新账户就有显示,大佬有遇到过这种情况吗...
我现在国内自己的账户也是这样
对于前端有几个问题:
- 顶部的折线图是可视化的什么数据呢
横轴是当天时间,纵轴是预约时间最早变化情况,用的是echart.js,当时现学的
- 底部的评论区不知道能不能整合进React,我明天睡醒看看他们的开发者文档
只需要一行就好了:
<div id="disqus_thread"></div>
<script async src="https://tuixue-online.disqus.com/embed.js"></script>
- 这里指的region是各大洲(欧洲|亚洲|南/北美)吗,然后需不需要按照签证类型和系统(cgi, ais, mx)也做相应的filter
都行其实,你觉得怎么看来的清爽就怎么改也行(
cgi和ais我觉得可能还是要分一下
可以比如做成响应式的那种样子,比如鼠标点一下链接或者地图,上面的chart和下面的table就更新,之类的;当然我现在是很不支持把mx单独分类,因为这个本来就是ais的一部分,当时是因为地方太多了专门拆一个tab,没想到现在ais里面更多。。。
from tuixue.online-visa.
不知道和你想的前后端分离一不一样,把自己脑补的sequence diagram画了一下。简单来说就是Global Back End只暴露一个route即 /global/{visaType}
其中 visaType
是签证类型 {'FJ', 'B', 'H', 'O', 'L'}
。然后region
和sys
代表region(目前想的是按洲划分)和使用的系统{'cgi', 'ais'}
。然后Global Back End会把从爬虫端GET的数据简单处理之后返回给Front End。
Global Back End API
Get available schedule date by VISA type
GET /global/{visaType}?region={region}&sys={sys}
Parameter
Param | Required | Explanation |
---|---|---|
visaType | True | Type of VISA to show, can only by one of {'FJ', 'B', 'H', 'O', 'L'} |
Query | Type | Required | Explanation |
---|---|---|---|
region | string | False | Filtering the U.S. Embassy/Consulate in specific region |
sys | string | False | Filtering by the systems used for VISA interview appointment |
我现在国内自己的账户也是这样
我发现新注册的账户好像手工进入柬埔寨cgi系统,开始预约流程,跳过/updatedata
直接选/selectvisapriority
为non-resident并提交,再跳回到/udpatedata
这个日期显示就会消失
from tuixue.online-visa.
图有点问题,不能做成真正的响应式请求不然爬虫服务器会挂掉的(指48分的时候大家都来点)。大概意思是左边是个单独的loop,右边也是个单独的loop,二者独立
Global Back End API
Get available schedule date by VISA type
GET /global/{visaType}?region={region}&sys={sys}
Parameter
Param Required Explanation
visaType True Type of VISA to show, can only by one of {'FJ', 'B', 'H', 'O', 'L'}
干脆也把visatype做成一个parameter?我的考虑是如果之前大家收藏这个网页的话,链接是/global
,然后如果接下来改成/global/F
的话就会产生无法访问之前的网页(除非把前面的改成redirect)
Query Type Required Explanation
Param Required Explanation
region string False
sys string False
from tuixue.online-visa.
图有点问题,不能做成真正的响应式请求不然爬虫服务器会挂掉的(指48分的时候大家都来点)。大概意思是左边是个单独的loop,右边也是个单独的loop,二者独立
明白了。就是如果只是我右边的loop在请求爬虫服务器的话,其实可以高频率(1秒1次)地请求这样,然后缓存在内存里给左边的loop用
如果两个后端都跑在同一个机器上的话,我是不是可以直接读取对应的json文件,而不是去request爬虫服务器这样呢?
干脆也把visatype做成一个parameter?我的考虑是如果之前大家收藏这个网页的话,链接是
/global
,然后如果接下来改成/global/F
的话就会产生无法访问之前的网页(除非把前面的改成redirect)
emmm你指的是把visaType
也做成query吗,像这样:
Query | Type | Required | Explanation |
---|---|---|---|
visaType | string | False | Filtering the specific visa type |
region | string | False | Filtering the U.S. Embassy/Consulate in specific region |
sys | string | False | Filtering by the systems used for VISA interview appointment |
GET /global?visaType={vT}®ion={reg}&sys={sys}
不过这个后端api应该是不暴露给用户的吧,前端网页还是保持之前的地址tuixue.online/global/
。不过你这么一说我觉得确实这个后端api是有点混淆了,可以改一个方式,变成类似于 /globalbackend?visaType={vT}®ion={reg}&sys={sys}
这样?
from tuixue.online-visa.
最右边那一栏是其他的服务器,第一栏和第二栏是同一台
是的
可以
from tuixue.online-visa.
大概像这样?另外后端是prefer python-based (Django/Flask) over Node.js是吗
from tuixue.online-visa.
是的
没有prefer,如果全部重构的话没有问题,反正api就长那样。此外就是邮件通知和qq/tg通知也得重写一下(不过也不是啥问题,反正都是调api
(顺便也可以把/visa给重构了
from tuixue.online-visa.
没有prefer,如果全部重构的话没有问题,反正api就长那样。此外就是邮件通知和qq/tg通知也得重写一下
主要是我之前写Expressjs多,没有写过Django,现学代码质量可能真的8太行,然后我看邮件通知的代码notify.py
是在global目录下,所以这是没有分离到api后端的是吗(没做过email这一块啊可能有很多silly questions大佬见谅...
另外有一个和爬虫相关的问题:当时你在写爬虫的时候,是怎么手动记录post的时候的表格的呢,cgi的机制每一次post都会刷新页面,Chrome Developer Tools都会刷新...
from tuixue.online-visa.
主要是我之前写Expressjs多,没有写过Django,现学代码质量可能真的8太行,然后我看邮件通知的代码
notify.py
是在global目录下,所以这是没有分离到api后端的是吗(没做过email这一块啊可能有很多silly questions大佬见谅...
我没说一定要django……
是的,这个notify写的有点丑,耦合程度有点大(
需要我更新下email和其他通知的api吗?(指写文档
另外有一个和爬虫相关的问题:当时你在写爬虫的时候,是怎么手动记录post的时候的表格的呢,cgi的机制每一次post都会刷新页面,Chrome Developer Tools都会刷新...
我的做法是开个mitmproxy拦截数据,用代理模式,也有些其他工具可以做这些事情(不过差不多都是基于mitm的思路
from tuixue.online-visa.
我没说一定要django……
是的,这个notify写的有点丑,耦合程度有点大(
需要我更新下email和其他通知的api吗?(指写文档
今天入门了Django,好像没有想象中复杂(本来功能就简单
顺便吐槽这厮写RESTful api居然还要加第三方包 (强迫症犯了
能更新一下文档当然是最好了,感谢大佬lol(regardless 我还是会认真读源码的lol
我的做法是开个mitmproxy拦截数据,用代理模式,也有些其他工具可以做这些事情(不过差不多都是基于mitm的思路
Cool的,等我有实质性代码进步了再更新issue(过两天
from tuixue.online-visa.
能更新一下文档当然是最好了,感谢大佬lol(regardless 我还是会认真读源码的lol
更了一部分在readme里面,明天接着更
from tuixue.online-visa.
更新好了
from tuixue.online-visa.
我来update了大佬,消化代码花了相当一些时间(concurrent programming学的稀烂+注释有点少lol ,有一些代码的理解和不理解的点我在下面列出来了要是有什么地方不正确的麻烦纠正我一下...
For ../global/crawler/lite_visa.py
- 整个程序通过多线程方式从crawler server请求数据,其中用于抓数据的session(cgi & ais)缓存在一个global dict里,这个dict里的session(主要)通过Producer-Consumre threading模型对一个队列(
replaced_items
)进行更新/维护。 - 主要的几个thread相关:
add_session
:对队列replaced_items
进行监测,replaced_items.get()
会一直卡住直到有新的session更新请求出现crawler(_ais)
:这两个函数会对每一个(visa_type
,place
)调用一次crawler_req(_ais)
去拉取最新的数据并写到./{place}/{YYYY}/{MM}/{DD}
里(我好一会儿才反应过来{DD}
是个文本(雾, 并且这里会触发notify.py
set_interval
:这个函数我没理解为什么它不会大量积累线程? 求解释啊我脑袋瓜子都想破了,它的func_wrapper
为什么能递归调用还能返回的...但是我理解它会按照visa_type
和ais/cgi在每一个interval
之后调用crawler(_ais)
更新所用place
的日期,所以set_interval
是在visa_type
层面的按时刷新。
- 全局变量
global_var.py
,关键在于thread-safely set/get session
For new implementation in my fork
- RESTful api的实现(还没写好lol)我选择了FastAPI。相较于传统的Django和Flask,除了performance更快之外,它很pythonic,文档也很完备
- 目前重写了拉取数据的功能,并且尝试整合了AIS和CGI代码,主要工作有:
session_operation.py
: 创建了Session
类,用于代表一个CGI/AIS session;SessionCache
类, 按(visa_type, location)
存储session,并提供接口对session进行更新和维护,相当于整合了lite_visa.py里的g.value('session', {})
和class SessionOp
。visa_status_fetcher.py
: refactor了lite_visa.py,把requests
相关绑到了一个class VisaFetcher
里(可能没必要?,对于cli增加了log_name
和log_dir
来配置全局LOGGER
。主要的改动是我把set_interval
的逻辑向下移了一层,在lite_visa.py里每一个visa_type
会设置一个间隔并批量request,在新的代码里,时间间隔还是按照visa_type
定的,但是set_fetching_interval
会直接调用VisaFetcher.fetch_visa_status
并对其设置间隔。global_var.py
:增加了一些global variable,包括Producer-Consumer的队列也放在这里了。
目前有一个问题是我无法测试代码,因为没有crawler.txt和ais.json,不知道这些secret文件方不方便发我对新代码进行测试?
我会发一个PR方便大佬审核代码,但是这个PR我还不想merge,因为还有没有实现的功能。 要是有什么写的不合适的地方请批评指正哇:D
from tuixue.online-visa.
目前有一个问题是我无法测试代码,因为没有crawler.txt和ais.json,不知道这些secret文件方不方便发我对新代码进行测试?
wx私聊,其他的事情可以去 #37 下面说(
from tuixue.online-visa.
Related Issues (20)
- Interview slot alert for Bern, Switzerland
- 关于选择了日期之后,时间列表是空列表的问题 HOT 4
- 德国信息缺失 HOT 2
- Looks like the application is down? No new generated data since 2023/07/17 at 10 AM CST HOT 1
- How real-time are the alerts?
- Is ais changing the system that unpaid account cannot see the latest available dates?
- 网站运营问题
- 加拿大H1B空白了 HOT 1
- Website not working HOT 1
- Email Notification is not working i guess HOT 3
- tcn no for Canada Site HOT 4
- 咨询美签api 限制 HOT 7
- Newest Fetch time doesn't show up on appointment page HOT 4
- B1/B2 visa status data not available since March 4 HOT 1
- Question about the node in ais register api HOT 2
- AIS api rate-limit policy HOT 2
- **CGI签证系统无法在主页访问到可用时间 HOT 3
- How to get more "real time" in mexico
- 爬虫API 无法 login HOT 3
- Is Italy US slot possible
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tuixue.online-visa.