标签: font

  • 宝塔7.9开心版安装

    安装

    wget -O install.sh http://download.bt.sy/ltd/install/install-ubuntu_6.0.sh && sudo bash install.sh
    ShellScript

    升级到7.9

    curl https://io.bt.sy/install/update_panel.sh|bash
    ShellScript

    如果遇到不能安装请手动制定hosts

    206.119.73.11  io.bt.sy  download.bt.sy  api.bt.sy  cloud.bt.sy  auth.bt.sy  poi.bt.sy  io.bt.sy
    ShellScript
  • 量子非凡资源站去广告的代码,把里面的域名换成自己的域名就可以了!

    量子非凡资源站去广告的代码,把里面的域名换成自己的域名就可以了!

    <?php
    error_reporting(0);
    //关闭所有PHP错误报告
    define('IFHC',1);
    //是否缓存视频链接 1 缓存 0 不缓存
    define('HCFILE',__DIR__.'/cache/');
    //缓存保存的文件夹 如果不缓存请无视
    define('HCTIME',604800);
    //缓存时效 秒为单位 如果不缓存请无视
    header('Content-type: text/json;charset=utf-8');
    
    $url = $_GET['url'];
    $MD5 = Md5($url).'.m3u8';
    if (is_dir(HCFILE)==false) {
      mkdir(HCFILE,0755,true);
    }
    if (IFHC==1 && file_exists(HCFILE.$MD5) && filemtime(HCFILE.$MD5) + HCTIME > time()) {
      $arr = array(
        'code' => 200,
        'msg' => '解析成功',
        'cache' => true,
        'url' => 'https://www.wucuoym.com/cache/'.$MD5
      );
      die(json_encode($arr,456));
    }
    $data = curl($url);
    if (empty($data)) {
      die(404);
    }
    if (strstr($data,'.ts')==false) {
      $explode = explode('/',$data);
      $ts = explode("\n",$explode[0])[2];
      $url = str_replace('index.m3u8','', $url).$ts.'/'.$explode[1].'/'.$explode[2];
      $data = curl($url);
    if (empty($data)) {
      die(404);
    }
    }
    echo m3u8ts($url,$MD5,$data,$explode[2]);
    
    
    function m3u8ts($wz , $file , $data , $name){
        $data = preg_replace('/#EXTINF:(.*),\n?http(.*)\n?/','',$data);
        preg_match('/\/\/(.*)\/'.$name.'/',$wz,$ym);
        $web = 'https:'.str_replace($name,'', $ym[0]);
        $m3u8 = preg_replace('/#EXTINF:(.*),\n?(.*)\n?/',"#EXTINF:$1,\n$web$2\n",$data);
        file_put_contents(HCFILE.$file,$m3u8);
        $arr = array(
          'code' => 200,
          'msg' => '解析成功',
          'url' => 'https://www.wucuoym.com/cache/'.$file
        );
        die(json_encode($arr,456));
        return;
    }
    function curl($url) {
    if(!function_exists('curl_init')) die('php.ini未开启php_curl.dll'); 
      $user_agent = $_SERVER['HTTP_USER_AGENT'];
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "accept: */*",
        "accept-encoding: gzip, deflate",
        "accept-language: zh-CN,zh;q=0.9",
        "Connection: keep-alive",
      ));
      curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36');
      curl_setopt($ch, CURLOPT_REFERER,'https://www.wucuoym.com/');
      curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate");
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
      @ $file = curl_exec($ch);
      curl_close($ch);
      return $file;
    }
    PHP
  • 如何将OTF / TTF文件转换为EOT格式?

    如何将OTF / TTF文件转换为EOT格式?

    最简单的方法就是使用

    font-face generator (everythingfonts.com)

    不仅会生成所有的web字体,还会把css自动生成好,无比的方便。

    @font-face {
      [font-family: <family-name>;]?
      [src: [ <uri> [format(<string>#)]? | <font-face-name> ]#;]?
      [unicode-range: <urange>#;]?
      [font-variant: <font-variant>;]?
      [font-feature-settings: normal|<feature-tag-value>#;]?
      [font-stretch: <font-stretch>;]?
      [font-weight: <weight>];
      [font-style: <style>];
    }

    使用字体松鼠发生器 – 这不仅会产生EOT,而且还会产生SVG和WOFF格式,并且一次转换多个字体文件,并将所有内容与相关的CSS一起提供到单个存档中。

    这里有一个快速的方法来从otf一步build立TTF和EOT版本。 当然,如果你不需要所有的东西,你可以把相关部分拉出来。 请注意,你从otf得到eot你必须去otf-> ttf-> eot。

    安装fontforge和ttf2eot。 他们在MacPorts中可用,不确定其他平台。

    将其保存为名为otf2ttf2eot.sh的脚本文件:

    (此脚本已更新为新的fontforge版本;原始脚本在post的末尾):

    #!/bin/sh otfFont="$1.otf" ttfFont="$1.ttf" eotFont="$1.eot" fontforge -c ' import fontforge font = fontforge.open("'$otfFont'") font.generate("'$ttfFont'") ' ttf2eot "$ttfFont" >"$eotFont"

    假设您有一个名为FontName.otf的字体,请运行:

    sh otf2ttf2eot.sh FontName

    旧版本fontforge的原始脚本:

    #!/bin/sh # Convert an OTF font into TTF an EOT formats. otfFont="$1.otf" ttfFont="$1.ttf" eotFont="$1.eot" fontforge -c ' Open("'$otfFont'"); Generate("'$ttfFont'"); Quit(0);' ttf2eot $ttfFont > $eotFont
  • 突破Discuz!的防采集

    突破Discuz!的防采集

    当短时间内频繁采集discuz,会触发discuz的防采集机制,默认打开的是一段javascript脚本,然后再通过跳转跳转到真实地址,这样子的情况下如何采集呢,本文将教会你如何破解这类型的防采集的采集。

    Discuz开启防采集后的采集方法,也就是帖子后面加了?dsign=这样子的

    Discuz在X3中增加了防采集功能,具体见Discuz x3.0防采集设置图文教程

    [b2_insert_post id=”558″]

    开启防采集后,访问DZ站点的伪静态链接如http://www.discuz.net/thread-3275423-1-1.html后面会跟上一个?_dsign=xxxxxx,正常链接如http://www.discuz.net/forum.php?mod=viewthread&tid=3305274会加上&_dsign=xxxxxx。这让人很不爽 (o#゜ 曲゜)o

    使用httplib2访问原帖子页面(下面以http://www.dz.net/forum.php?mod=viewthread&tid=768为例),返回的是一段混淆过的js,如:

    <script type="text/javascript">RKbW=function(){'RKbW';var _R=function(){return '=76'}; return _R();};function AIV(AIV_){function _A(AIV_){function ph(){return getName();}function AIV_(){}return ph();return AIV_}; return _A(AIV_);}DmZP='iew';_IX161 = 'assign';function zoQ(zoQ_){function ti(){return getName();};return ti();return 'zoQ'}function r2oe(){'return r2oe';return 'ad&'}_eloda = 'replace';F59s=function(){'return F59s';return 'p?m';};HP=function(){'return HP';return 'n';};function getName(){var caller=getName.caller;if(caller.name){return caller.name} var str=caller.toString().replace(/[\s]*/g,"");var name=str.match(/^function([^\(]+?)\(/);if(name && name[1]){return name[1];} else {return '';}}uM=function(){'return uM';return '9';};eG9=function(eG9_){'return eG9';return eG9_;};function kp(kp_){function _k(kp_){function o(){return getName();}function kp_(){}return o();return kp_}; return _k(kp_);}vD='1';BN=function(){'BN';var _B=function(){return 'r'}; return _B();};HALw='rum';_RZnE9 = 'href';o5y=function(o5y_){'return o5y';return o5y_;};function PH(){'return PH';return '.'}_BDkwZ = location;function w2(){'return w2';return '_'}KTI4=function(){'return KTI4';return '910';};_NUuAJ = window;wX=function(){'wX';var _w=function(){return 'd'}; return _w();};iyL=function(iyL_){'return iyL';return iyL_;};location.replace((function(){'return Q8mM';return '/fo'})()+HALw+PH()+AIV('Gs8')+F59s()+kp('nm')+(function(){'return njFH';return (function(){return 'd=v';})();})()+DmZP+eG9('th')+BN()+(function(){'return XD';return 'e'})()+r2oe()+zoQ('yKM')+wX()+RKbW()+'8&'+w2()+o5y('ds')+iyL('ig')+HP()+(function(){'return l26W';return '=6f'})()+uM()+(function(){'return by';return (function(){return '7';})();})()+KTI4()+vD);_NUuAJ['href']=(function(){'return Q8mM';return '/fo'})()+HALw+PH()+AIV('Gs8')+F59s()+kp('nm')+(function(){'return njFH';return (function(){return 'd=v';})();})()+DmZP;</script>

    显然这样人类是无法理解的……不过使用notepad++的JSFormat插件格式化后还是能看懂的嗯-v-

    实际上这是一个字符串替换然后重定向的脚本,生成原理如下(不完全按照上面的例子):

    • 原始字符串为location.href=forum.php?mod=viewthread&tid=768&_dsign=6f979101
    • 随机分割这个这个串,如分成l, oc, a, tio, n., ……
    • 对每一个子串替换成一个随机命名的函数,如l替换成_Oc9S(),则在脚本里加一句function _Oc9S(){return ‘l’;}以此类推
    • 每个function都可能加入奇怪的例如’return l;’这样毫无意义的混淆
    • 最后在末尾加上window.href=yyy,yyy为取forum.php?mod=viewthread&tid=768&_dsign=6f979101的前x个字符后得到一个子串

    我大概写得不清楚……就……这么个意思……

    [content_hide]

    毫无疑问要使用PyV8了,本来想自己写个解释器,但是算法太渣只能呜呼哀哉QAQ
    这里有个问题,PyV8只是一个js解释器的包装,不是浏览器的js运行时,因此location啊window啊都是undefined的,所以要手动把这些都去掉。(有一点要说明,就是由于js很骚,location.href有时会被写成location[‘href’],或者用location.assign或者location.replace,而assign和replace都可能被一个随机命名的变量替换掉了)

    dz-anti-anti-crawler

    直接看代码吧

    import PyV8
    import re
    js='''<script type="text/javascript">.........</script>'''
    #去掉<script>标签
    js=js[31:-9]
    for st in ['window','location',"'assign'","'href'","'replace'"]:
    equal=re.findall('[_A-Za-z0-9 =]+%s;'%st,js)#找到变量赋值等式
    if equal==[]:#有可能没有
    continue
    else:
    equal=equal[0]
    var=equal.split('=')[0].strip()#找出变量名
    #把等式干掉
    js=js.replace(equal,'')
    #把变量替换成它真正的意思
    js=js.replace(var,st)
    #把['xx'] 替换成 .xx
    js=js.replace("['%s']"%st.strip("'"),'.%s'%st.strip("'"))
    #将 window.href= 后的内容踢掉,因为当PyV8只输出最后一个等式的值
    if re.findall('window\.href=.+',js)!=[]:
    js=js.replace(re.findall('window\.href=.+',js)[0],'')
    #删掉location.xxx=
    js=js.replace('location.href=','').replace('location.replace','').replace('location.assign','')
    #交给你了-v-
    ctxt2 = PyV8.JSContext()
    ctxt2.enter()
    print ctxt2.eval(js)

    这样就得到了包含dsign的新url,可以继续爬了

    最后对DZ的防采集再说几句

    1. 防采集是对IP不对用户的
    2. 而且要看站长的设置,有可能只对帖子或日志等开启;你们可以到Discuz x3.0防采集设置图文教程感受一下
    3. _dsign的值是固定的,计算完一次js后可以考虑保存起来,以后可以直接访问加上_dsign的url
    4. 防采集是针对不支持js的机器人的,如果用python直接控制浏览器的话,可以无视之
    5. 如果mechanize和PyV8能合体那该多好~ o(* ̄▽ ̄*)o

    [/content_hide]