原创百篇纪念2048蒙特卡洛法与强化学习测试+B站视频爬取与Cookie攻击测试

Posted 囚生CY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创百篇纪念2048蒙特卡洛法与强化学习测试+B站视频爬取与Cookie攻击测试相关的知识,希望对你有一定的参考价值。

序言

这是笔者断更时间最长的一次,每次打开编辑器想要写些什么,却总是提不起兴致,或许因为这是第一百篇博客,出于某种仪式性的强迫,总是希望能够写出点有趣的内容出来。

然而新一轮的疫情扬州成为风暴眼,笔者被关了近四十天的禁闭,人在家里憋得太久确实是会愈发怠惰,失去活力,不仅是工作学习,而且原计划在暑期专攻 5000 5000 5000米争取达标 20 20 20分钟,结果到头又退化到半年前的水平。即便如此,也只有每天在跑步机上的几十分钟才能让笔者重新找回动力,零零碎碎地也做了不少尝试,却也迟迟没有足以提笔的素材。

回校第四天,决定还是把过去一个多月的工作挑出一些有趣的东西整理一文。本文分为两个部分:

  1. 第一部分是关于经典小游戏 2048 2048 2048的自动化脚本及强化学习算法 D Q N \\rm DQN DQN的测试。缘起笔者在 B \\rm B B站偶然发现的视频 U P \\rm UP UP主的项目地址在GitHub@2048GameAutoMovePython,该项目是利用自定义评分函数及三层蒙特卡洛模拟实现的 P y G a m e \\rm PyGame PyGame游戏自动化,效果确实非常卓越,经测试有八成以上的成功率通关 2048 2048 2048,如果将蒙特卡洛做到四五层成功率几乎做到 100 % 100\\% 100%,其实代码核心是在于评分函数的设计,确实很巧妙,笔者觉得这是不容易想得到的。

    笔者的工作是在此基础上做了一些改进后在上面测试了强化学习的实现。由于笔者主攻自然语言处理,强化学习相对经验较少(众所周知强化学习在 N L P \\rm NLP NLP里是走不通的),因此希望能够实现一个强化学习算法加深理解。本来准备自己实现一个推箱子游戏(私以为推箱子真的很难),正好抓到现成的可以用也就省事。很有意思的是,居然还有好事者写了推箱子的 P y t h o n \\rm Python Pythongym-sokoban,可以直接使用pip安装,库项目地址在GitHub@gym-sokoban,另外gym是一个很有趣的强化学习包,是可以用来做物理引擎机器人的强化学习的。

    事实上近期笔者发现 g i t h u b \\rm github github上有巨佬给出了一个非常好用的 P y T o r c h \\rm PyTorch PyTorch实现的各种强化算法的仓库GitHub@Deep-Reinforcement-Learning-Algorithms-with-PyTorch,有空值得好好学习一下。

  2. 第二部分是关于 B \\rm B B站视频下载及 C o o k i e \\rm Cookie Cookie攻击测试,笔者本来确实很早有想要开始提笔,主要原因就是 C o o k i e \\rm Cookie Cookie攻击测试进行的很不顺利,但是笔者认为 B \\rm B B站在登录验证上确实存在很大漏洞,理论上存在可以攻破的可能,原因及攻击脚本详见下文。

    至于视频下载笔者给出两种下载的方式,第一种可以直接下载完整的 m p 4 \\rm mp4 mp4文件,第二种则是将视频与音频分别下载,其实并不是很困难,因为 B \\rm B B站完全没有在 J S \\rm JS JS上对视频源的信息进行加密,第一种方法甚至只需要抓包即可,都不需要分析页面源码。

    另外 G i t H u b \\rm GitHub GitHub有各视频网站视频下载的代码仓库,具体地址笔者忘了,但是好像它的代码并不开源,提供的只是安装程序,需要下载安装后使用。



第一部分 2048 2048 2048蒙特卡洛法与强化学习测试

(一) 2048 P y G a m e \\rm 2048PyGame 2048PyGame脚本及蒙特卡洛法

代码可以直接从原作者处GitHub@gym-sokoban获取,为了能够和下面的强化学习承接上,可以使用笔者提供的整理后的代码,结构如下所示:

../
   manage.py
   config.py
../src/
       ai.py
       game.py
       utils.py
../logging/ # 空文件夹

上述五个文件的代码如下所示:

  • m a n a g e . p y \\rm manage.py manage.py
# -*- coding: UTF-8 -*-
# @author: caoyang
# @email: caoyang@163.sufe.edu.cn

import os
import time
import pygame

from pygame.locals import (QUIT,
                           KEYDOWN,
                           K_ESCAPE,
                           K_LEFT,
                           K_RIGHT,
                           K_DOWN,
                           K_UP,
                           K_w,
                           K_a,
                           K_s,
                           K_d,
                           K_k,
                           K_l,
                           MOUSEBUTTONDOWN)

from config import GameConfig

from src.utils import load_args, save_args, draw_text
from src.game import Game, Button
from src.ai import AI

args = load_args(GameConfig)
save_args(args, f'logging/config_time.strftime("%Y%m%d%H%M%S").json')


# Initialize game
pygame.init()

# Set window
os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % args.window_pos
raw_screen = pygame.display.set_mode((args.window_width, args.window_height), pygame.DOUBLEBUF, 32)
screen = raw_screen.convert_alpha()
pygame.display.set_caption(args.window_title)

interval = args.interval
state = 'start'
clock = pygame.time.Clock()
game = Game(args.grid_dim)
ai = AI(args)
next_direction = ''
last_time = time.time()
reward = -1

buttons = [
    Button('start', 'Restart', (args.grid_size + 50, 150)),
    Button('ai', 'Autorun', (args.grid_size + 50, 250)),
]


while not state == 'exit':

    if game.state in ['over', 'win']:
        state = game.state

    if state == 'ai' and next_direction == '':
        next_direction, reward = ai.get_next(game.grid.tiles, random_strategy=args.random_strategy)

    # Listen events
    for event in pygame.event.get():
        if event.type == QUIT:
            state = 'exit'
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                state = 'exit'
            elif event.key in [K_LEFT, K_a] and state == 'run':
                next_direction = 'L'
            elif event.key in [K_RIGHT, K_d] and state == 'run':
                next_direction = 'R'
            elif event.key in [K_DOWN, K_s] and state == 'run':
                next_direction = 'D'
            elif event.key in [K_UP, K_w] and state == 'run':
                next_direction = 'U'
            elif event.key in [K_k, K_l] and state == 'ai':
                if event.key == K_k and interval > 0:
                    interval *= 0.9
                if event.key == K_l and interval < 10:
                    if interval == 0:
                        interval = .01
                    else:
                        interval *= 1.1
                if interval < 0:
                    interval = 0

        if event.type == MOUSEBUTTONDOWN:
            for button in buttons:
                if button.is_click(event.pos):
                    state = button.name
                    if button.name == 'ai':
                        button.name = 'run'
                        button.text = 'Manual'
                    elif button.name == 'run':
                        button.name = 'ai'
                        button.text = 'Autorun'
                    break

    # Direction
    if next_direction and (state == 'run' or state == 'ai' and time.time() - last_time > interval):
        game.run(next_direction)
        next_direction = ''
        last_time = time.time()

    # Start game
    elif state == 'start':
        game.start()
        state = 'run'

    # Fill background color
    screen.fill((101, 194, 148))

    # Draw text
    draw_text(screen, f'Score: game.score', (args.grid_size + 100, 40), args.fontface)
    if state == 'ai':
        draw_text(screen, f'Interval: interval', (args.grid_size + 100, 60), args.fontface)
        draw_text(screen, f'Reward:round(reward, 3)', (args.grid_size + 100, 80), args.fontface)

    # Draw button
    for button in buttons:
        if button.is_show:
            pygame.draw.rect(screen, (180, 180, 200), (button.x, button.y, button.w, button.h))
            draw_text(screen, button.text, (button.x + button.w / 2, button.y + 9), args.fontface, size=18, center='center')

    # Draw map
    for y in range(args.grid_dim):
        for x in range(args.grid_dim):
            # Draw block
            number = game.grid.tiles[y][x]
            size = args.grid_size / args.grid_dim
            dx = size * 0.05
            x_size, y_size = x * size, y * size
            color = args.colors[str(int(number))] if number <= args.max_number else (0, 0, 255)
            pygame.draw.rect(screen, color, (x_size + dx, y_size + dx, size - 2 * dx, size - 2 * dx))
            color = (20, 20, 20) if number <= 4 else (255, 255, 255)
            if number:
                length = len(str(number))
                if length == 1:
                    text_size = size * 1.2 / 2
                elif length <= 3:
                    text_size = size * 1.2 / length
                else:
                    text_size = size * 1.5 / length
                draw_text(screen, str(int(number)), (x_size + size * 0.5, y_size + size * 0.5 - text_size / 2), args.fontface, color=color, size=args.fontsize, center='center')

    if state == 'over':
        pygame.draw.rect(screen, (0, 0, 0, 0.5), (0, 0, args.grid_size, args.grid_size))
        draw_text(screen, 'Game over!', (args.grid_size / 2, args.grid_size / 2), args.fontface, size=25, center='center')

    elif state == 'win':
        pygame.draw.rect(screen, (0, 0, 0, 0.5), (0, 0, args.grid_size, args.grid_size))
        self.draw_text('Win!', (args.grid_size / 2, args.grid_size / 2), args.fontface, size=25, center='center')

    # Update
    raw_screen.blit(screen, (0, 0))
    pygame.display.flip()
    clock.tick(args.FPS)

print('退出游戏')
  
  • c o n f i g . p y \\rm config.py config.py
# -*- coding: UTF-8 -*-
# @author: caoyang
# @email: caoyang@163.sufe.edu.cn

import types
import argparse

class GameConfig:
    parser = argparse.ArgumentParser("--")
    parser.add_argument('--max_number', default=65536, type=int)
    parser.add_argument('--fontface', default='simhei', type=str)
    parser.add_argument('--fontsize', default=56, type=int)
    parser.add_argument('--window_pos', default=(100, 50), type=tuple)
    parser.add_argument('--window_title', default='2048', type=str)
    parser.add_argument('--window_width', default=720, type=int)
    parser.add_argument('--window_height', default=540, type=int)
    parser.add_argument<

以上是关于原创百篇纪念2048蒙特卡洛法与强化学习测试+B站视频爬取与Cookie攻击测试的主要内容,如果未能解决你的问题,请参考以下文章

强化学习

机器学习应用——强化学习&课程总结 实例 “自主学习Flappy Bird游戏”(MDP&蒙特卡洛强化学习&Q-learning&DRL&DQN)

强化学习笔记:AlphaGo(AlphaZero) ,蒙特卡洛树搜索(MCTS)

强化学习专栏|蒙特卡洛法(Monte Carlo Methods)

Reinforcement Learning强化学习系列之四:时序差分TD

Reinforcement Learning强化学习系列之四:时序差分TD