2024 年终 - 致谢幕

前奏

本来没想写年终的,但最近很多糟糕的事情都一并发生了,加上昨晚搞自动化刷鱼翅被加辣直接封禁了3天,禁言状态让我对自己也有了很多思考,起了离开的动念,顺带做一个年终回顾

着重提一下,并不是因为加辣,我从来都不是感情用事的人,一直认为,越是在事情紧迫的时候放纵情感,越容易做出事后后悔的事情,所以这个事情跟加辣无关,只是刚好给了我一个空间可以想想自己的事情

其实早就想走了,在鱼排的日子占用了我不少时间,虽然我总归能找到各种摸鱼的办法,但应该远没有鱼排能更消磨时间了,我的书架上堆满了很多新书,都是这几年买的,如果回家之后只想躺平,那么把书带到公司趁摸鱼的时候把它们看完或许是最好的选择,当初买书也是为了实现理想中的自己,一直摸鱼确实不太行

之前就想走结果走了大半年又跑回来了😂

(杭州近期拍摄照片镇楼)

1f49ff6929ed3c8dc6531bd5a501638.jpg

铺垫

2024在鱼排其实没有太多记忆,毕竟摸鱼嘛,天天聊天打屁有什么记忆,乐

不过收获还是有的,我平时用perl比较多,一直想转去python,但说实在的用习惯之后切换语言总归没有那么顺畅,虽然它们之间真的很像,是鱼排拯救了我的py😭 如果不是为了在鱼排实现自动化的和机器人各种玩耍,我还不会这么天天玩py,精进甚深,颇感欣慰

今年最大的事大概是我换了一次工作,这次更换非同以往,工作六年下来我换工作也算频繁的,基本做到了一年一换,但那更多是在思考自己是否真正热爱工作内容

我是生物专业出身,和鱼排调性不是很搭(笑),众所周知,生物行业是四大天坑之一,其坑在于国内生物的暗弱,这是一个典型高投入高风险的行业,百万千万的仪器在实验室里比比皆是,而配齐这些仅仅只是开始,没有这些东西甚至连实验都无法开展,初创成本就高出太多,但成果却少得可怜,生物的一大特性就是,不稳定,“一切皆有可能”,这不是一句假话,曾经看过搞笑算法之奇迹算法,其原理就是等待计算机因为被宇宙射线等因素发生0/1互换,从而完成的算法,但在生物领域,这种“奇迹”每天每分每秒都在上演,研发成果不可控,复现差,初创公司一个产品能推向市场平均需要十年时间,而生物产品又不能简单上市,就算千辛万苦研发出产品,还要到处找合作医院做一期二期三期临床实验,医院大多都嫌麻烦不肯好好做,完了还需要药监局进行场地检查审批,各种记录、措施必须一应俱全,十年时间导致的人员变动、仪器变换等,使得药监审批成了生物公司的超级大考,死在这一步的产品、公司数不胜数,高投入高风险低产出

因此,生物公司普遍做不大、做不强,生物行业从业人员也是普遍工资低、发展前景渺茫,又因为高技术性成为了唯学历论的行业,所以,前几年每年都在更换从业方向,历经分子、病理、测序,直到前年,才终于确定学程序走生信的路

那么今年的更换出于什么原因呢?工资,我第一次因为工资原因离职而不是我想找一个我喜欢的方向

很高兴现在的公司给了一个不错的薪资,让我上班颇为愉快,这也是我决心离开的一个点,工资高了,也不能像以前那样轻描淡写,少摸点鱼多学学,真能多点钱,也能完成自己一向来的心愿,做我心目中的自己,至少能出发不是?

另外今年也没什么正经相亲,毕竟快30大魔法师了,略过吧

高潮

好我的事讲完了,这部分是我这一年在鱼排玩自动化的分享,算是我在鱼排一年的收获?(笑)直接给代码,不过注意最近鱼排更换了连接方式,增加了不同节点,这部分我还没来得及写,鱼油可以自行修改,添加想要的功能,用python写的,关键模块为websocket

#!/usr/bin/env python
import re
from datetime import datetime   # 获取时间
from websocket import create_connection, WebSocketApp
import shelve     # 持久化存储键值
import json
import requests
import hashlib
import time
import os
import random

# 当前运行路径
path = os.getcwd()
abs_path = os.path.split(os.path.realpath(__file__))[0]

user = "abspath"
password = "xxxxx"


# 从持久化数据读取api
api_file = abs_path + "/api_file.db"
db = shelve.open(api_file)    # 打开数据库文件


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'Accept': 'application/json',
}

# 获取时间
def get_time():
    # 获取当前时间
    now = datetime.now()
    # 格式化时间输出,只包含小时、分钟和秒
    current_time = now.strftime("%H:%M:%S")
    return current_time


# 获取md5加密后登录密码
def get_key(user, password):
    global headers
    # 要加密的字符串
    string = password
    # 创建一个md5加密对象
    md5_object = hashlib.md5()
    # 更新加密对象,这里需要确保输入的是字节串
    md5_object.update(string.encode('utf-8'))
    # 获取加密后的16进制字符串
    md5_hexdigest = md5_object.hexdigest()

    # 目标URL
    url = 'https://fishpi.cn/api/getKey'

    # 要发送的JSON数据
    json_data = {
        'nameOrEmail': user,
        'userPassword': md5_hexdigest
    }

    # 发送POST请求,自动将字典转换为JSON格式的字符串
    response = requests.post(url, json=json_data, headers=headers)

    # 获取返回的JSON内容
    json_content = response.json()

    if json_content['code'] == 0:
        apiKey = json_content["Key"]
        with open(f'{abs_path}/yupai_key.txt', 'w') as f:
            print(user, apiKey, sep="\t", file=f)
        return apiKey


# 检查apiKey是否可用
def check_key(apiKey):
    global headers
    # 目标URL
    url = 'https://fishpi.cn/api/user?apiKey='
    full_url = url + apiKey
    response = requests.get(full_url, headers=headers)
    # 获取返回的JSON内容
    json_content = response.json()

    return json_content


# 领取昨日活跃奖励
def get_active(apiKey):
    global headers
    url = 'https://fishpi.cn/activity/yesterday-liveness-reward-api?apiKey='
    full_url = url + apiKey
    response = requests.get(full_url, headers=headers)
    # 获取返回的JSON内容
    json_content = response.json()
    return json_content['sum']


# 输出蓝色粗体文字
def print_blue(text):
    print("\033[1;34m" + text + "\033[0m")

# 输出红色粗体文字
def print_red(text):
    print("\033[1;31m" + text + "\033[0m")

# 输出绿色粗体文字
def print_green(text):
    print("\033[1;32m" + text + "\033[0m")


# 登录信息
def when_open(ws):
    print_green("鱼排聊天室已连接")


# 关闭信息
def when_close(ws, status_code, close_msg):
    print('断开连接成功')


# 错误信息
def on_error(ws, error):
    print("Error: " + str(error))


# 发送聊天室信息
def send_info(apiKey, to_info):
    global headers
    url = 'https://fishpi.cn/chat-room/send'
    now_week = datetime.now().weekday()

    # 要发送的JSON数据
    json_data = {
        'apiKey': apiKey,
        'client': "Python/1.0",
        "content": to_info
    }
    # 发送POST请求,自动将字典转换为JSON格式的字符串
    response = requests.post(url, json=json_data, headers=headers)
    json_content = response.json()
    print(json_content)


# 获取私信
def get_private_letter():
    global headers,md5_pass
    time.sleep(2)   # 等待2秒私信反应
    # 目标URL
    url = 'https://fishpi.cn/chat/get-message?apiKey='
    full_url = url + md5_pass + "&toUser=sevenSummer&page=1&pageSize=5"

    response = requests.get(full_url, headers=headers)
    # 获取返回的JSON内容
    response_dict = response.json()
    items = response_dict.get('data', [])
    for item in items:
        ...


# 接收ws回复信息
def on_message(ws, message):
    get_msg = json.loads(message)

    if get_msg['type'] == "revoke": next    # 信息被撤回的标志,不输出
    if get_msg['type'] == "customMessage": next     # 高级尊贵的土豪入场信息,不输出

    # 打印信息中的时间
    info_time = get_msg.get('time',get_time())
    # 获取在线人员信息
    if get_msg['type'] == "online":
            print_green(f"{info_time} ","")
            print_green("已接受到在线人员信息")
    elif get_msg['type'] == "msg":  # 聊天室信息
        # 将换行信息转为一行
        get_msg_text = get_msg['md'].replace("\n", " ")
        # 精简样式
        get_msg_text = re.sub(r'<\/?span.*?>','',get_msg_text)
        # 打印时间
        print_green(f"{info_time} ","")
        # 打印昵称信息
        print_blue(f"{get_msg['userNickname']}({get_msg['userName']}) ")
        # 打印信息本体
        print(f"  {get_msg_text}")


md5_pass = db.get(user, '99')
check_json = check_key(md5_pass)

if check_json['code'] == -1:
    print(f"{user} 密钥失效,重新获取,间隔5秒发起请求")
    time.sleep(5)
    md5_pass = get_key(user, password)
    db[user] = md5_pass     # 修改数据库中密钥值

print_green(f"当前用户: {user}")
# 领取昨日活跃
user_active = get_active(md5_pass)
if user_active == -1:
    print("昨日活跃积分已领取或不存在活跃")
else:
    print(f"领取昨日活跃积分: {user_active}")


# 连接聊天室
now_time = get_time()
print_blue(f"{now_time} 连接聊天室")
wss_url = "wss://fishpi.cn/chat-room-channel?apiKey=" + md5_pass
try:
    ws = WebSocketApp(        # 连接URL
        wss_url,
        on_open=when_open,         # 开启连接
        on_message=on_message,     # 接收信息
        on_close=when_close,    # 关闭连接
        on_error=on_error        # 错误信息
    )
    # 启动WebSocket客户端
    ws.run_forever()
except KeyboardInterrupt:    # 使用Ctrl+C中断时执行
    # 手动断开连接
    when_close(ws)
    print("手动断开")


# 关闭数据库
db.close()

谢幕

好吧其实写这总结的时候还是在想会不会被放出来?会不会被放出来?会不会被放出来?

写了一上午还是没有被放出来,看来还是我心不够坚定,风白闭门思过去了

什么时候会回来呢?等我看完了那一书架的书,学业有成之时吧,不然就是我背弃人生了

事已至此,属于风白的时间结束了,感谢看到这里的鱼油

(要不爆个照?)