特色

【Python】爬虫实战(1)

20行代码轻松爬取bilibili任意关键词搜索结果

需要准备的库

  • BeautifulSoup
  • requests
  • re

打开哔哩哔哩主页:

在搜索框中随意输入内容

可以看到划线部分的keyword=后正是我们搜索的内容,这时候按f12查看源代码

点击开发者工具左上角的按钮,将鼠标移动到第一个视频位置

第一条搜索结果所在的标签位置

打开标签,找到li标签下a标签的一条href信息,href指向的链接就正是我们搜索结果的视频地址

接着用同样的方法打开其他搜索结果的href链接,可以看到规律如下

http://www.bilibili.com/video/av 接视频id

我们的爬虫要做的就是模仿我们搜索的过程以及爬取每一个li表情下的href链接,也就是爬取视频链接

接着我们可以在此基础上让程序变得更灵活:

  • 自动存入文件
  • 自动保存视频

放代码

from bs4 import BeautifulSoup
import requests
import re
kewword=input('输入关键词:')
html_doc = "https://search.bilibili.com/all?keyword="+kewword+"&from_source=nav_search_new"
mode=int(input('是否存入文件'))
req = requests.get(html_doc)
req.encoding='utf-8'
html=req.text
soup = BeautifulSoup(html,'html.parser')
list_=[]
for k in soup.find_all('a'):
    list_.append(k.get('href'))

for i in list_:
        if i and i.find('www.bilibili.com/video/av')!=-1:
            if not mode:
                print(i)
            else:
                with open('bilibili website.txt','a') as f:
                    f.write(i+'\n')

程序完成

特色

相信未来

当我的鲜花依偎在别人的情怀, 我依然固执地用凝霜的枯藤, 在凄凉的大地上写下:相信未来。 我要用手指那涌向天边的排浪, 我要用手掌 那托起太阳的大海, 摇曳着曙光那支温暖漂亮的笔杆, 用孩子的笔体写下:相信未来

believe future

我之所以坚定地相信未来, 是我相信未来人们的眼睛—— 她有拨开历史风尘的睫毛, 她有看透岁月篇章的瞳孔。

我们能做的只有拼尽全力,即使迈出的步子再小,但也比原来更接近最终的目标

“逆水行舟,不进则退”

–博主Catci

奇数单增序列(C语言)

题目

奇数单增序列

描述

给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。

输入

共2行:
第1行为 N;
第2行为 N 个正整数,其间用空格间隔。

输出

增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。

样例输入

10
1 3 2 6 5 4 9 8 7 10

样例输出

1,3,5,7,9

代码如下

#include<stdio.h>
int main()
{
    int n,i,f,t,m,j=0,a[500];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
 
        scanf("%d",&m);
        if(m%2==1)                  //判断所输入的数据是否为奇数,若为奇数就把数存入到一维数组a[]中;
        {
            a[j]=m;
            j++;                    //用j来判断数组内的元素个数。
        }
 
    }
    for(i=0;i<j-1;i++)              //使用冒泡排序的方法对一维数组进行排序
    {
            int q=0;
            for(f=0;f<j-i-1;f++)
            {
                if(a[f]>a[f+1])
                {
                    t=a[f];
                    a[f]=a[f+1];
                    a[f+1]=t;
                }
 
 
            }
    }
 
    if(j==1)                   //需要考虑数组内数据只有一个数据时的情况。
        printf("%d",a[0]);
    else                       //数组内的数据大于一时。
    {
         for(i=0;i<j-1;i++)
        {
 
            printf("%d,",a[i]);
        }
        if(j>=2)
        {
            printf("%d",a[j-1]);
        }
    }
    //在刚开始没有考虑数组数值为一的情况;造成一直显示结果错误!
 
        return 0;
}

goflyway简单使用

Server端配置

# wget https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/goflyway.sh 
# chmod +x goflyway.sh 
# ./goflyway.sh 
...
[信息] 所有步骤 安装完毕,开始启动...
[信息] GoFlyway 启动中...
[信息] GoFlyway 启动成功 !

使用HTTP协议

在这里插入图片描述

使用KCP协议

————————————————

 GoFlyway 信息 :

 地址	: 45.63.85.166
 端口	: 2333
 密码	: testgofly
 协议	: KCP
 伪装	: 无
 链接	: goflyway://NDUuNjMuODUuMTY2OjIzMzNAZEdWemRHZHZabXg1OmtjcA  
 二维码 : http://doub.pw/qr/qr.php?text=goflyway://NDUuNjMuODUuMTY2OjIzMzNAZEdWemRHZHZabXg1OmtjcA 
 
[注意] 链接仅适用于Windows系统的 Goflyway Tools 客户端(https://doub.io/dbrj-11/)。
————————————————
1234567891011121314

备注:

最好不要使用默认端口(2333),测试测试发现容易出现dial time out

client端配置

1 下载Goflyway、Goflyway Tools,将其放在同一目录下

Goflyway Tools下载

目录结构如下:

在这里插入图片描述
需要注意的是: Goflyway Tools只是一个辅助软件,无法独立使用必须配合 Goflyway Windows命令行版客户端才能使用

启动Goflyway Tools

和使用shadowsocks一样,打开Goflyway Tools.exe,复制前面生成的服务器端链接地址

goflyway://NDUuNjMuODUuMTY2OjIzMzNAZEdWemRHZHZabXg1ZDJGNTpodHRw

然后点击”导入分享链接”,点击文件位置右侧的”浏览”, 指定goflyway.exe路径,再点击”保存配置”, 最好紧接着”检查延迟”,在测试延迟的同时判断是否能够和目标主机正常通信,如果显示”延迟测试成功”,紧接着点击”启动”即可。
启动后,默认的代理模式为”PAC”模式,分别访问http://www.ip138.com/和https://whoer.net/zh,正常情况下前者返回国内ip,后者返回vps主机的ip
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

速度测试

  • 一定要安装google tcp bbr加速软件,安装前后速度差距非常大。安装google bbr之后使用HTTP协议观看视频1速度可达2000-8000Kbps(幅度变化较大) ,而未安装时使用HTTP协议访问速度简直慢成蜗牛,只有300kbps。而1080p视频使用goflyway HTTP协议的连接速率定在3000-8000Kbps左右,相比ssr来说更加稳定
  • 安装google tcp bbr之后,使用KCP协议访问,速度依然慢的惊人,速率只有100-300Kbpbs

效果图

在这里插入图片描述

总结

测试下来,在vps ip可以ping通的情况下,使用HTTP协议或KCP协议都能实现代理翻墙的功能。
但是KCP 协议并不能复活被墙IP,在测试延迟的时候直接提示测试延迟超时。
最好不要使用默认端口2333,容易被封(虽然可以ping 通,但查看日志会发现 dial time out)

其他注意事项

安装goflyway后若第一天一切正常,第二天就用不了了,服务器端可以正常连接,但是始终无法访问google等国外被墙网站
ssh使用以下命令:

sudo ./goflyway -k="test" -l=":3456" -lv dbg

命令行参数

浏览器 <(HTTP代理)> 大陆VPS <(goflyway + websocket)> CloudFlare <(HTTP)> 美国VPS

下载GoFlyWay

前往 https://github.com/coyove/goflyway/releases 下载二进制程序。
假设最新版本为v2.0.0 rc1,则直接

mkdir gfw && cd gfw
wget https://github.com/coyove/goflyway/releases/download/2.0.0rc1/goflyway_linux_amd64.tar.gz

#解压
tar xvf *gz

在美国VPS上启动GoFlyWay作为Server

./goflyway -l=":8888"

在大陆VPS上启动GoFlyWay作为Client

your_domain='abc.com'
./goflyway -l=":8888" -up=cf://${your_domain}:80

END

Python徒手实现识别手写数字(2)

csdn_export_md

Python徒手实现识别手写数字—简易图片数据库

写在前面

上一篇文章Python徒手实现识别手写数字—图像的处理中我们讲了图片的处理,将图片经过剪裁,拉伸等操作以后将每一个图片变成了1×10000大小的向量。但是如果只是这样的话,我们每一次运行的时候都需要将他们计算一遍,当图片特别多的时候会消耗大量的时间。

所以我们需要将这些向量存入一个文件当中,每次先看看图库中有没有新增的图片,如果有新增的图片,那么就将新增的图片变成1×10000向量再存入文件之中,然后从文件中读取全部图片向量即可。当图库中没有新增图片的时候,那么就直接调用文件中的图片向量进行计算就好。这样子算是节省了大量的时间。

所以本文就是从零开始建立一个这样的图片存储管理系统。

实现逻辑

第一次读入图片

我们的图库中拥有一大堆图片,每一张图片上面都是一个手写的数字,图片的名称为[数字内容]_[序号]。比如说一个图片的名称为2_3,代表这一张图片里面的数字是2,并且是“数字是2的第3张图片”。

存在一个csv文件作为我们的建议的图片数据库,名称为Data.csv。

首先我们读取图库中所有图片的名称,保存在fileNames中。然后读取Data.csv中所有数据。

提取出Data.csv的最后一列(一共10002列,第10001列说明该数字是什么数字,第10002列是图片的名称),也就是数据库中存储的所有图片的名称,存储在item中。

将新加入图库的图片名称保存在newFileNames中。如果Data.csv为空,那么就直接令newFileNames = fileNames。也就是说如果数据库中什么也没有,那么图库中所有图片都是新加入的。

如果Data.csv不为空,那么就将item里面的内容与fileNames的内容比较,如果出现了fileNames里面有的名称item中没有,那么就将这些名称放进newFileNames中。如果item里有的名称fileNames中没有,那就不管。

也就是说,我令我们的数据库只进不出。

现在我们得到了新加入图库的图片的名称newFileNames。

将newFileNames中的名称的图片带入上一文中函数GetTrainPicture进行处理,得到了一个nx10001的矩阵,每一行代表一个新加入的图片,前10000列是图片向量,第10001列是该图片的数字,保存在pic中。

将这些图片压入到数据库的后面。

读取之前数据库原有的图片向量,并与pic合并,得到目前拥有的所有的训练图片向量pic。

Created with Raphaël 2.2.0图库图片名称fileNames数据库为空?全部导入newFileNames带入GetTrainPicture函数得到矩阵pic与数据库中原有数据合并压入数据库数据库图片名称item比较得到newFileNamesyesno

以上就是本章写的所有内容,下面放出代码来详细解释一下。

代码解析

主文件

import os
import numpy as np
import OperatePicture as OP
import OperateDataBase as OD
import csv

##Essential vavriable 基础变量
#Standard size 标准大小
N = 100
#Gray threshold 灰度阈值
color = 100/255

#读取原CSV文件
reader = list(csv.reader(open('DataBase.csv', encoding = 'utf-8')))
#清除读取后的第一个空行
del reader[0]
#读取num目录下的所有文件名
fileNames = os.listdir(r"./num/")
#对比fileNames与reader,得到新增的图片newFileNames
newFileNames = OD.NewFiles(fileNames, reader)
print('New pictures are: 'newFileNames)
#得到newFilesNames对应的矩阵
pic = OP.GetTrainPicture(newFileNames)
#将新增图片矩阵存入CSV中
OD.SaveToCSV(pic, newFileNames)
#将原数据库矩阵与新数据库矩阵合并
pic = OD.Combination(reader, pic)

我将两节内容分别封装在两个py文件里面,上一篇文章中的图片的切割与处理等所有内容我放在文件OperatePicture里面了,这一节的数据库处理放在了文件OperateDatabase里面。

因为整个代码的逻辑我在上面已经捋过一遍了,所以我不再解释其中的内容,接下来针对每个函数开始讲解。

OperateDatabase代码

从上面的主文件中,我们首先用到了函数NewFiles,主要是对比fileNames和reader这两个文件中图片的名称有什么不同,返回值是新增的图片的名称的列表。下面是代码

def NewFiles(fileNames, reader):
    '''判断是否有不同于数据库中的新文件加入'''
    #如果数据库中没有数据,则返回filenames
    if len(reader) == 0:
        return fileNames
    else:
        #从数据库中提取所有名称
        files = [item[10001] for item in reader]
        #需要加入的图片名称
        newFileNames = []
        for item in fileNames:
            #判断当前名称是否存在数据库中
            #如果不存在,则加入newFileNames
            if item not in files:
                newFileNames.append(item)
        return newFileNames

首先判断reader是否有内容,如果没有内容,说明是第一次执行,那么会直接把fileNames返回。否则才会进入下面进行比较。

返回了newFileNames之后,就会把这个列表中的所有名称的图片通过GetTrainPicture函数得到一个1×10001大小的矩阵,具体过程请看我上一篇文章讲的内容。

之后为了把新的数据存入CSV文件中,我们利用函数SaveToCSV将pic存入文件中,具体代码如下。

def SaveToCSV(pic, fileNames):
    '''将pic与对应的dileNames存入CSV文件'''
    writer = csv.writer(open('Database.csv', 'a', newline = ''), dialect = 'excel')
    #将fileNames变为列表
    f = [item for item in fileNames]
    #每一行依次写入文件中
    for i in range(len(pic)):
        #将改行图片向量转为list
        item = pic[i].tolist()
        #将这个图片向量对应的名称f放入列表最后一个
        item.append(f[i])
        writer.writerow(item)

当函数运行过后,会把pic矩阵对应的内容直接给续写入CSV文件中,相当于数据库操纵的写入,并不会覆盖之前原有的数据。

之后我们需要将数据库原有的一大堆数据reader和新加进来的数据pic合并到pic里面,所以利用Combination函数将两个矩阵合并,代码如下

def Combination(reader, pic):
    '''将两个矩阵reader与pic合并'''
    #两个矩阵的总行数
    l = len(reader) + len(pic)
    #初始化新的矩阵
    newPic = np.zeros(l*10001).reshape(l, 10001)
    #将reader最后的那个字符串名称去掉
    for item in reader:
        item.pop()
    #将reader转化为numpy的矩阵形式
    reader = np.array(reader)
    #新矩阵前半部分放reader,后半部分放pic
    if len(reader) != 0:
        newPic[0:len(reader), :] = reader
    newPic[len(reader):len(pic), :] = pic
    return newPic

因为reader最后一行还包括了一个图片的名称,所以先利用pop将其去掉,之后转化为矩阵形式,然后再直接放入矩阵中。这个矩阵操作可能没有见过,下面我详细解释一下。

假如我现在有一个2×3的矩阵和一个2×2的矩阵

m = [[1 2 3]
     [4 5 6]]
n = [[7 8]
     [9 1]]

我可以进行如下操作

#操作一
m[:, 0:2] = n
print(m)
#操作二
m[:, 1:3] = n
print(m)

#以下为输出结果
#操作一
[[7 8 3]
 [9 1 6]]
#操作二
[[7 7 8]
 [9 9 1]]

可以看出操作一直接把m的第一二列给替换成n,操作二把m的第二三列替换成了n。具体过程可以百度查一下numpy的矩阵的操作,也可以自己总结规律,不细讲了。

以上就是这一篇的全部代码。

小结

这一篇我相当于用CSV文件制作了一个非常简陋的数据库,能够执行的操作只有识别已有内容NewFiles与添加内容SaveToCSV,并没有插入、删改等操作。主要是我觉得这两个函数目前已经够用,因此只写了这两个操作,所以再需求已经被满足的情况下就不再拓展了。

所有的源代码已经上传到了我的GitHub上,可以前去下载,谢谢阅读。

如果喜欢的话麻烦点一个喜欢哦,加关注可以得到超厉害的更新提醒。

自己搭建ss/ssr服务器教程(适合初学者,不怕被封ip)

购买好服务器后,使用ssh连接服务器

以下笔者购买的是CentOS服务器

CentOS6/Debian6/Ubuntu14 ShadowsocksR一键部署管理脚本:

yum -y install wget

wget -N --no-check-certificate https://softs.fun/Bash/ssr.sh && chmod +x ssr.sh && bash ssr.sh

备用脚本:

yum -y install wget

wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh &&chmod +x ssr.sh && bash ssr.sh

备用脚本2:

yum -y install wget

wget -N --no-check-certificate https://cdn.qqiyu.cn/ssr.sh && chmod +x ssr.sh && bash ssr.sh

复制上面的代码到VPS服务器里,按回车键,脚本会自动安装,以后只需要运行这个快捷命令就可以出现下图的界面进行设置,快捷管理命令为:bash ssr.sh

如上图出现管理界面后,输入数字1来安装SSR服务端。如果输入1后不能进入下一步,那么请退出xshell,重新连接vps服务器,然后输入快捷管理命令bash ssr.sh 再尝试。

根据上图提示,依次输入自己想设置的端口和密码 (密码建议用复杂点的字母组合,端口号为40-65535之间的数字),回车键用于确认

注:关于端口的设置,总的网络总端口有6万多个,理论上可以任意设置。但是有的地区需要设置特殊的端口才有效,一些特殊的端口比如80、143、443、1433、3306、3389、8080。

如上图,选择想设置的加密方式,比如10,按回车键确认

接下来是选择协议插件,如下图:

选择并确认后,会出现上图的界面,提示你是否选择兼容原版,这里的原版指的是SS客户端(SS客户端没有协议和混淆的选项),可以根据需求进行选择,演示选择y

之后进行混淆插件的设置。

注意:如果协议是origin,那么混淆也必须是plain;如果协议不是origin,那么混淆可以是任意的。有的地区需要把混淆设置成plain才好用。因为混淆不总是有效果,要看各地区的策略,有时候不混淆(plain)让其看起来像随机数据更好。(特别注意:tls 1.2_ticket_auth容易受到干扰!请选择除tls开头以外的其它混淆!!!)

进行混淆插件的设置后,会依次提示你对设备数、单线程限速和端口总限速进行设置,默认值是不进行限制,个人使用的话,选择默认即可,即直接敲回车键。

注意:关于限制设备数,这个协议必须是非原版且不兼容原版才有效,也就是必须使用SSR协议的情况下,才有效!

之后代码就正式自动部署了,到下图所示的位置,提示你下载文件,输入:y

耐心等待一会,出现下面的界面即部署完成:

根据上图就可以看到自己设置的SSR账号信息,包括IP、端口、密码、加密方式、协议插件、混淆插件,这些信息需要填入你的SSR客户端。如果之后想修改账号信息,直接输入快捷管理命令:bash ssr.sh 进入管理界面,选择相应的数字来进行一键修改。例如:

脚本演示结束。
此脚本是开机自动启动,部署一次即可。最后可以重启服务器确保部署生效(一般情况不重启也可以)。重启需要在命令栏里输入reboot ,输入命令后稍微等待一会服务器就会自动重启,一般重启过程需要2~5分钟,重启过程中Xshell会自动断开连接,等VPS重启好后才可以用Xshell软件进行连接。如果部署过程中卡在某个位置超过10分钟,可以用xshell软件断开,然后重新连接你的ip,再复制代码进行部署。


第三步:一键加速VPS服务器
此加速教程为谷歌BBR加速,Vultr的服务器框架可以装BBR加速,加速后对速度的提升很明显,所以推荐部署加速脚本。该加速方法是开机自动启动,部署一次就可以了。

按照第二步的步骤,连接服务器ip,登录成功后,在命令栏里粘贴以下代码:

yum -y install wget

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh

chmod +x bbr.sh

./bbr.sh

把上面整个代码复制后粘贴进去,不动的时候按回车,然后耐心等待,最后重启vps服务器即可。

演示开始,如图:

复制并粘贴代码后,按回车键确认

如下图提示,按任意键继续部署

注意:部署过程中若出现失败现象,请检查你的命令和Python版本

最后输入y重启服务器,如果输入y提示command not found ,接着输入reboot来重启服务器,确保加速生效,bbr加速脚本是开机自动启动,装一次就可以了。

服务器重启成功并重新连接服务器后,输入命令lsmod | grep bbr 如果出现tcp_bbr字样表示bbr已安装并启动成功。如图:

购买vps服务器后,ip有了,通过部署,端口、密码、加密方式、协议和混淆也有了,最后将这些信息填入SSR客户端就可以翻墙啦。

有了账号后,打开SSR客户端,填上信息

在对应的位置,填上服务器ip、服务器端口、密码、加密方式、协议和混淆,最后将浏览器的代理设置为(http)127.0.0.1和1080即可。账号的端口号就是你自己设置的,而要上网的浏览器的端口号是1080,固定的,谷歌浏览器可以通过 SwitchyOmega 插件来设置。

启动SSR客户端后,右键SSR客户端图标,选择第一个“系统代理模式”,里面有3个子选项,选择”全局模式“,之后就可以用浏览器设置好了的代理模式(http)127.0.0.1和1080翻墙,此模式下所有的网站都会走SSR代理。(适合新手)


常见问题参考解决方法:
1、用了一段时间发现ssr账号用不了了

首先ping一下自己的ip,看看能不能ping的通,ping不通那么就是ip被墙了,ip被墙时,xshell也会连接不上服务器,遇到这种情况重新部署一个新的服务器,新的服务器就是新的ip。关于怎么ping ip的方法,可以自行网上搜索,或者用xshell软件连接服务器来判断,连不上即是被墙了。vultr开通和删除服务器非常方便,新服务器即新ip,大多数vps服务商都没有这样的服务,一般的vps服务商可能会提供免费更换1次ip的服务。

2、刚搭建好的ssr账号,ip能ping通,但是还是用不了

首选排除杀毒软件的干扰,尤其是国产杀毒软件,比如360安全卫生、360杀毒软件、腾讯管家、金山卫生等。这些东西很容易干扰翻墙上网,如果你的电脑安装了这样的东西,建议至少翻墙时别用,最好卸载。其次,检查下SSR信息是否填写正确。浏览器的代理方式是否是ssr代理,即(HTTP)127.0.0.1 和1080。如果以上条件都排除,还是用不了,那么可以更换端口、加密方式、协议、混淆,或者更换服务器位置。另外,如果你的vps服务器配置的是SSR账号,即有协议和混淆且没有兼容原版(SS版),那么你必须使用SSSR客户端来使用账号,因为SS客户端没有填写协议和混淆的选项。

3、有的地区需要把混淆参数设置成plain才好用。因为混淆不总是有效果,要看各地区的策略,有时候不混淆(plain)让其看起来像随机数据更好。

4、电脑能用但手机用不了

如果你的手机用的是SS客户端,SS客户端没有填协议和混淆的地方,如果你部署的协议和混淆的时候没有选择兼容原版(SS版),因此手机是用不了的。这个时候你把协议弄成兼容原版、混淆也设置成兼容原版即可。或者直接将协议设置成origin且混淆设置成plain。

5、vps的服务器操作系统不要用的太高,太高可能会因为系统的防火墙问题导致搭建的SSR账号连不上,如果你用的centos系统,建议用centos6,不要用centos7。如果你前面不小心装了centos7系统,那么只能重装系统或者重新部署新的vps服务器。

6、vultr服务商提供的vps服务器是单向流量计算,有的vps服务商是双向流量计算,单向流量计算对于用户来说更实惠。因为我们是在vps服务器上部署SSR服务端后,再用SSR客户端翻墙,所以SSR服务端就相当于中转,比如我们看一个视频,必然会产生流量,假如消耗流量80M,那么VPS服务器会产生上传80M和下载80M流量,vultr服务商只计算单向的80M流量。如果是双向计算流量,那么会计算为160M流量。

7、如果你想把搭建的账号给多人使用,不用额外设置端口,因为一个账号就可以多人使用。一般5美元的服务器可以同时支持40人在线使用。

如果想实现支持每个用户(端口)不同的加密方式/协议/混淆等,并且管理流量使用,可以参考多用户配置脚本:wget -N --no-check-certificate https://softs.fun/Bash/ssrmu.sh && chmod +x ssrmu.sh && bash ssrmu.sh 备用脚本:wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssrmu.sh && chmod +x ssrmu.sh && bash ssrmu.sh 安装后管理命令为:bash ssrmu.sh
注意:这个多用户配置脚本和教程内容的脚本无法共存!要想用这个脚本,把之前的脚本卸载,输入管理命令bash ssr.sh ,选择3,卸载ShadowsocksR即可卸载原脚本。

8、vultr服务器每月有流量限制,超过限制后服务器不会被停止运行,但是超出的流量会被额外收费。北美和西欧地区的服务器超出流量后,多出的部分收费为0.01美元/G。新加坡和日本东京(日本)为0.025美元/G,悉尼(澳大利亚)为0.05美元/G。把vultr服务器删掉,开通新的服务器,流量会从0开始重新计算。

9、vultr怎样才能申请退款呢?

vultr和其他的国外商家一样,都是使用工单的形式与客服联系,如果需要退款,直接在后台点击support,选择open ticket新开一个工单,选择billing question财务问题,简单的在文本框输入你的退款理由。比如:Please refund all the balance in my account。工单提交以后一般很快就可以给你确认退款,若干个工作日后就会退回你的支付方式。(全额退款结束后,账号可能会被删除)

如果英语水平不好,但是想和客服进行交流,可以用百度在线翻译,自动中文转英文和英文转中文。

JS基本特效 6个js页面效果图

<table border oncontextmenu=return(false)><td>no</table>//1.彻底屏蔽鼠标右键
<body onselectstart="return false">                     //2.取消选取、防止复制
<noscript><iframe src="/blog/*.html>";</iframe></noscript>//3.网页不能被另存为
<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:1 solid #000000"></textarea>//4.横线文本框
<body onblur="this.focus();">//5.让弹出窗口总是在最上面
<input onkeydown="if(event.keyCode==13)event.keyCode=9">//6.点击enter按键后把光标移动到下一个文本框

高级特效(需要jQuery)

//7.页面点击特效
var a_idx = 0;
        jQuery(document).ready(function($) {
            $("body").click(function(e) {
                var a = new Array("❤不做咸鱼!❤","❤拒绝懒惰!❤","❤想做吃货❤","❤拒绝单身❤","❤向大佬学习❤","❤扶我起来~❤","❤come on❤","❤一直在路上~❤","❤累了~❤","❤再趴一会❤","❤66666❤","❤高兴的飞起*****❤");
                var $i = $("<span></span>").text(a[a_idx]);
                a_idx = (a_idx + 1) % a.length;
                var x = e.pageX,
                y = e.pageY;
                $i.css({
                    "z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
                    "top": y - 20,
                    "left": x,
                    "position": "absolute",
                    "font-weight": "bold",
                    "color": "rgb("+~~(255*Math.random())+","+~~(255*Math.random())+","+~~(255*Math.random())+")"
                });
                $("body").append($i);
                $i.animate({
                    "top": y - 180,
                    "opacity": 0
                },
                1500,
                function() {
                    $i.remove();
                });
            });
        });

7.二次元人物

因网站平台所限,代码片段已经存入gitee,请跳转获取

JS炫酷时钟

仿智能社官网:原生JS实现简单又酷炫的3D立方体时钟

页面进来的时候,先给6个立方体赋值上现在的时间,由于立方体比较小,左右2个面看不清且影响效果,这里左右2个面就不赋time了;

//获取元素
var oul = document.querySelectorAll("ul");
var back = document.querySelectorAll(".back");
var front = document.querySelectorAll(".front");
var Top = document.querySelectorAll(".top");
var bot = document.querySelectorAll(".bot");
var btn = document.querySelector("button");
//获取当前时间,放到数组数组方便循环赋值var arr = [];

arr[0] = Math.floor(new Date().getHours() / 10);
arr[1] = new Date().getHours() % 10;
arr[2] = Math.floor(new Date().getMinutes() / 10);
arr[3] = new Date().getMinutes() % 10;
arr[4] = Math.floor(new Date().getSeconds() / 10);
arr[5] = new Date().getSeconds() % 10;

//页面进来的时候循环给6个立方体的几个面分别赋值时间,(由于定时器的存在,不然会有0.5秒的间隔是没有时间的)

//分别对应前后上下
for (var i = 0; i < arr.length; i++) {
       front[i].innerHTML = arr[i];
       back[i].innerHTML = arr[i] + 2 >= 10 ? (arr[i] + 2) % 10 : arr[i] + 2;
       Top[i].innerHTML = arr[i] + 3 >= 10 ? (arr[i] + 3) % 10 : arr[i] + 3;
       bot[i].innerHTML = arr[i] + 1 >= 10 ? (arr[i] + 1) % 10 : arr[i] + 1;
}

我们只关注front前面这一个面,其他的面只是修饰作用

定时器函数开始:

function time() {

//重新获取当前时间

var arr2 = [];
arr2[0] = Math.floor(new Date().getHours() / 10);
arr2[1] = new Date().getHours() % 10;
arr2[2] = Math.floor(new Date().getMinutes() / 10);
arr2[3] = new Date().getMinutes() % 10;
arr2[4] = Math.floor(new Date().getSeconds() / 10);
arr2[5] = new Date().getSeconds() % 10;
//循环判断立方体front的数字时候有变化,如有有变化就加上类,实现翻转效果,css代码写在transition类里了,

//css关键类

       .transition {
            transition: all 0.5s;
            transform: rotateY(-7deg) rotateX(95deg);
}

 

关键:判断数字是否变化

for (var i = 0; i < oul.length; i++) {

if (front[i].innerHTML != arr2[i]) {
oul[i].classList.add("transition");
}

 

//给每个立方体加上过渡结束事件webkitTransitionEnd (其他浏览器有不同的写法,这里只写chrome的)

oul[i].index = i;
oul[i].addEventListener("webkitTransitionEnd", function() {

  //为几个面赋值数字

front[this.index].innerHTML = arr2[this.index];
back[this.index].innerHTML = arr2[this.index] + 2 < 10 ? arr2[this.index] + 2 : (arr2[this.index] + 2) % 10;
Top[this.index].innerHTML = arr2[this.index] + 3 < 10 ? arr2[this.index] + 3 : (arr2[this.index] + 3) % 10;
bot[this.index].innerHTML = arr2[this.index] + 1 < 10 ? arr2[this.index] + 1 : (arr2[this.index] + 1) % 10;

  //移除过渡事件,让立方体回到翻转前的效果

this.classList.remove("transition");

})

}

}

//开启定时器
setInterval(time, 500)

至此已经完成了,打开网页看看效果吧。

源码位置

通过 WordPress.com 设计一个这样的站点
从这里开始