没错,就是CBA池子沉了
结论:SR和SSR的出货概率符合官方公示的数据,只是我运气太差了
19年8月30日晚7点,坐标上海唐镇,马路上一弱智掏出手机领完3周年签到补贴300石头后开始抽卡,10S后抽卡结束,没有看到CBA。
我抽了,1秒十连有什么好说的,一定是阿B在后台动了出货概率!
我一定要调查清楚,不出货肯定不是我的原因。 这时候想起了Fgo的B站官网有个实时滚动的出货信息,打开Chrome,F12查看调试信息。 得到如下两个链接,
- https://message.bilibili.com/api/tooltip/query.list.do
- 作用未知,但是和下面链接一样,总是周期性发起请求
- https://activity.biligame.com/board/list?game_id=112&game_key=a5f36e53ab3b0c41&rows=31
- 出货数据获取API
那么开始编写代码吧,Pycharm启动
跑了不知道多长时间以后,得到了169911条数据。 下面对这些数据进行一些统计


其中SSR有41496条记录,而SR有128415,由于没有SR的记录,也没有礼装的记录,能做的就是计算出SR和SSR比值, 41496 ÷ 128415 ≈ 0.32313982011447260834014717906787
而官网给出的数据是

四星从者和五星从者的出货比应该是1:3,和41496:128415非常接近,所以fgo的出货率理论上说并没有问题。 但是有了这些数据,不妨再做些其他有意识的事情,比如下表。
| 服务器 | 数量 | 所占比例 |
|---|---|---|
| 安卓bilibili服 | 125103 | 73.6% |
| 安卓联运服 | 7188 | 4.2% |
| ios服 | 37620 | 22.1% |
附件
import requests
import sqlite3
import time
## 在进行查询请求前需要访问的一个链接
beforeQuery = "https://message.bilibili.com/api/tooltip/query.list.do"
## 查询抽卡情况的链接
summonDataUrl = "https://activity.biligame.com/board/list"
## 查询参数,游戏id
game_id = 112
## 查询参数游戏key
game_key = "a5f36e53ab3b0c41"
## 未知参数
rows = 31
## 查询参数payload
payload = {
'game_id': game_id,
'game_key': game_key,
'rows': rows
}
class SummonData:
# id 相当于所有玩家按照顺序抽中的编号
# sname 服务器
# rname 玩家昵称
# info 抽中从者名称
# star 从者等级
def __init__(self, id, sname, rname, info, star):
self._id = id
self._sname = sname
self._rname = rname
self._info = info
self._star = star
def insert(self, cursor):
if cursor:
cursor.execute('select * from SUMMON where id=?', (self._id,))
# 判断查询到的结果是否有重复
query_result_counter = len(cursor.fetchall())
# 如果没有重复则说明允许插入
if query_result_counter == 0:
cursor.execute(
"""insert into SUMMON (id, sname, rname, info, star) values ({},"{}","{}","{}","{}")""".format(
self._id,
self._sname,
self._rname,
self._info,
self._star))
print('Insert Done! {}, {}, {}, {}, {}'.format(self._id,
self._sname,
self._rname,
self._info,
self._star))
else:
print("重复记录")
def getDataFromNetWork():
b = requests.get(beforeQuery)
if b.json()['code'] == 0:
r = requests.get(params=payload, url=summonDataUrl)
return r.json()
return {'code': 0, 'data': []}
def createTable():
conn = sqlite3.connect('fgo.db')
cursor = conn.cursor()
print('Start Create Table')
cursor.execute('''CREATE TABLE SUMMON
(ID INT NOT NULL,
SNAME CHAR(16) NOT NULL,
RNAME CHAR(16) NOT NULL,
INFO CHAR(16),
STAR CHAR(8));''')
conn.commit()
conn.close()
## createTable() # 创建完成后续无需再次调用
if __name__ == '__main__':
conn = sqlite3.connect('fgo.db')
cursor = conn.cursor()
# 请求次数
request_counter = 1
# 请求间隔,同时是一个倒计时器, 单位秒(S)
request_interval = 30
while True:
if request_interval == 30:
content = getDataFromNetWork()
if len(content['data']) > 0:
for record in content['data']:
summondata = SummonData(int(record['id']), record['sname'], record['rname'], record['info'],
record['star'])
summondata.insert(cursor)
conn.commit()
request_counter += 1
request_interval = 0
time.sleep(1)
print("Next Request ETA: {}|Current Time: {}".format(30 - request_interval,
time.asctime(
time.localtime(time.time()))))
request_interval += 1