标签 curl 下的文章

模拟易名中国域名的点赞

易名中国的域名有点赞功能,点赞数高可以被推荐,但只能点一次,那么需求就来了

ename.jpg

方法一: ajax请求

与源代码的js类似,需要注意的是跨域问题, 因为请求的二级域名是www,所以也要在www主机页面的控制台(console)里跑,否则会返回非法请求

var praise = 0, num = 123456;   // num为你域名页面的id,在浏览器的url中可以直观看到
var _this = $('#praise');
var url = "http://www.ename.com/auction/praise"+'/' + num + '/' + praise;
// 这是它页面的源代码
$.ajax({
        url:url,
        type:'get',
        dataType:'json',
        success:function(data) {
            switch(data.flag) {
                case 1:
                    _this.find('.praise_amount').html("("+data.count+")");
                    var html = '<div class="dz_tip"><span class="outsideb"></span><span class="insideb"></span>点赞成功</div>';
                        _this.find('.praise_r').after(html);
                    $('.dz_tip').stop().fadeOut(2000, function() {
                        $(this).remove();
                    })
                    praise = data.praise;
                    break;
                case 2:
                default:
                    alert(data.msg);
            }
        }
});
  • 问题: 由于它服务端有对ip的判断,所以这代码只能用一次,而且不利于在linux服务器上跑脚本,所以替换方案来了

方法二: curl模拟

<?php

header('Content-Type: text/html; charset=utf-8');

// $num为你页面域名的id,可以在浏览器的url中直观看到
function run($num, $second = 30){

    $url = "http://www.ename.com/auction/praise/$num";

    $headers['CLIENT-IP'] = '202.103.229.46'; 
    $headers['X-FORWARDED-FOR'] = '202.103.229.46';
    $headers['X-Requested-With'] = 'XMLHttpRequest';    // 重要
    // X-Requested-With:XMLHttpRequest

    $headerArr = array(); 
    foreach( $headers as $n => $v ) { 
        $headerArr[] = $n .':' . $v;  
    }

    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url.'/0');
    curl_setopt ($ch, CURLOPT_HEADER, 1);
    curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr );  //构造IP
    // curl_setopt ($ch, CURLOPT_REFERER, $url);   //构造来路

    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}

$res = run(123456);
  • 可以再对其优化下,加个循环把ip随机, 再加个sleep停顿下,再在header中中随机个UA模拟下更像
  • 返回结果如下就成功了
{"flag":1,"msg":"\u70b9\u8d5e\u6210\u529f","count":48,"praise":1}

再次提醒慎用,导致域名被封了概不负责

PHP curl获取内容

因为php原生函数file_get_contents()无发获取https协议头的url内容(需要mod_ssl的支持,或安装opensll

  • windows下的PHP,只需要到php.ini中把extension=php_openssl.dll前面的;删掉,重启服务就可以了。
  • linux下的PHP,就必须安装openssl模块,安装好了以后就可以访问了。
  • 使用curl模块获取url的封装函数如下:
    /**
     * 抓取的url链接内容
     * @param string $url    要抓取的url链接,可以是http,https链接
     * @param int $second    设置cURL允许执行的最长秒数
     * @return mixed    
     */
    function get_curl_contents($url, $second = 30)
    {
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);//设置cURL允许执行的最长秒数
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);//当此项为true时,curl_exec($ch)返回的是内容;为false时,curl_exec($ch)返回的是true/false
             
        //以下两项设置为FALSE时,$url可以为"https://login.yahoo.com"协议
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  FALSE);
     
        $content = curl_exec($ch);
        curl_close($ch);
        return $content;
    }