同步Twitter到Weibo

我的同步方法比较复杂,但同步时差理论上不会超过15分钟。

大致流程。

1. Twitter to Wrodpress

这里利用了ifttt网站的同步功能

时差最多15分钟,就是因为ifttt每十五分钟才执行一次task.

这里blog的文章内容就是tweet:

2. WordPress to Weibo

这步耗了我最多时间,因为一般同步到微博都是标题加链接,但这不是我所想要的,我想要的是blog文章内容就等于发表的微博内容。

这步是我通过修改一个现成的插件完成的:blog一发表文章,就同时在微博上发一条微博,内容就是blog的文章内容。

同步结果图:

至于为什么不写个中间程序分别同步两边,而一定要从twitter同步weibo?

因为ifttt现在不支持国内的微博社区之类的,而现在打通了twitter和weibo后,变相扩大了ifttt可以做的事,嘿嘿

 

香港勞工處網頁資料提取

最近准备找工作,有一个需求:我希望我在劳工处看中某个工作时,只要输入这个工作的id之类的,然后程序就自动帮我生成应征邮件,寄出,再将工作的资料储存到数据库方便以后查看。

为什么我有这样的需求?因为懒。

众所周知,应征邮件是有模板的,需要替换的也就职业公司之类的,所以程序绝对可以自动完成。

难就难在提取工作资料这里。

下面是劳工处的工作职位列表:

http://www1.jobs.gov.hk/1/0/webform/jobseeker/jobsearch/quickview.aspx?ResetTimeStamp=true&SearchFor=jobtype&id=5

而我需要的是右下角部分的内容。

查看源码:

是用f_getJobCard()这个js函数来获取内容。里面的一串字符应该就是每个工作职位的id之类的。

然后再查看js文件。

jobcard_20110624.js里的f_getJobCard函数。

function f_getJobCard(p_ordNo) {
    var v_random = Math.floor(Math.random() * 5);
    var v_liveOnly = true;
 
    if (g_jobCardInPrintMode == false) {
        v_liveOnly = f_getQueryString("live");
    }
 
    switch (v_random) {
        case 0:
            { g_quickviewWS = '/1/0/WebServices/QuickviewWS.asmx'; break; }
        case 1:
            { g_quickviewWS = '/1/0/WebServices/Quickview1WS.asmx'; break; }
        case 2:
            { g_quickviewWS = '/1/0/WebServices/Quickview2WS.asmx'; break; }
        case 3:
            { g_quickviewWS = '/1/0/WebServices/Quickview3WS.asmx'; break; }
        default:
            { g_quickviewWS = '/1/0/WebServices/Quickview4WS.asmx'; break; }
    }
 
    $.ajax({
        type: "POST",
        async: false,
        url: g_quickviewWS + "/F_GetJobCardDetail",
        contentType: "application/json; charset=utf-8",
        data: "{p_ordNo:'" + p_ordNo + "',p_langOpt: '" + g_langOpt + "',p_liveOnly: '" + v_liveOnly + "'}",
        dataType: "json",
        success: f_getJobCard_Succeeded,
        error: function(xhr, ajaxOptions, thrownError) {
            //            alert(xhr.status);
            //            alert(thrownError);
 
            if (g_jobCardInPrintMode == false) {
                $('#' + g_ies_uxErrMsg_id).show();
                $('#' + g_ies_uxJobCardArea_id).hide();
                $('#' + g_ies_uxJobCardPt2Note_id).hide();
            }
        }
    });
 
}

我看不明白上面为什么请求地址用random来决定,负载均衡?不过算了,反正用那个也行。知道url和请求的数据格式,就可以用curl来取数据了。

我是用codeigniter的一个curl库来写的,不过大致意思差不多,片断如下:

	/**
   	* Get jobcard information
   	*
   	* @access  public
   	* @param string
   	* @return  array
   	*/
	function get_jobcard( $jobcard = '')
	{
		$url = 'http://www1.jobs.gov.hk/1/0/WebServices/Quickview4WS.asmx/F_GetJobCardDetail';
		$this->curl->open();
		$headers = array
		(
	  		'Content-Type: application/json; charset=utf-8'
		);
		$postfields = '{p_ordNo:"' . $jobcard . '",p_langOpt:"2",p_liveOnly:"ture"}';
		$content = $this->curl->http_post($url, $postfields, $headers);
		$this->curl->close();
		//var_dump($content);
		$obj = json_decode($content);
		return  $obj->{'d'};
	}

注意post的数据要是json格式,其中$jobcard就是id之类的一串的字符,ajax返回的是json格式的数据,函数里转换成了数组。

var_dump返回的数据如下

object(stdClass)#16 (1) { ["d"]=> array(20) { [0]=> string(17) "36-11-0015574 CM " [1]=> string(10) "20/12/2011" [2]=> string(15) "電腦技術員" [3]=> string(9) "零售業" [4]=> string(38) "黃金電腦速遞(香港)有限公司" [5]=> string(9) "天水圍" [6]=> string(61) "提供客戶電腦維修服務,協助店舖電腦零售服務" [7]=> string(60) "中三程度; 一般粵語; 懂讀寫中文; 懂電腦維修" [8]=> string(72) "每月$8,000 - $9,000, 上午11時至下午9時, 每週工作6天,輪休" [9]=> string(175) "求職者請親臨觀塘開源道68號觀塘廣場M樓18號舖黃金電腦速遞(香港)有限公司面試。查詢請致電與陳先生(96816007)/余小姐(96816004)聯絡。" [10]=> string(1) "-" [11]=> string(4371) "如何應徵?空缺咭上有僱主的聯絡資料..." [12]=> string(1) "1" [13]=> string(2) "-1" [14]=> string(1) "N" [15]=> string(4) "8000" [16]=> string(1) "0" [17]=> string(4) "1300" [18]=> string(10) "20/12/2011" [19]=> string(32) "czk0VEJNZy96M1ZuL2ttYVdsZ2Zqdz09" } }

数据取出来之后,之后…之后你想怎样就怎样了,发email和存入数据库那里不说了。

也就是说,我只要将看中的工作的类似id的字符串输入程序,然后就可以自动生成了邮件连同简历帮我发送出去,再将工作的资料储存在数据库中方便以后查看。

一键式搞掂。

 

GD2函数库小应用

公司最近要求搞个小功能,用到以前没接触过的GD2库,记下来留个笔记。

界面

代码

 

 

<?php
    $method = $_REQUEST['method'];
    $size = $_REQUEST['size'];
    $hw = explode('x',$size);
    $height = $hw[0];
    $width = $hw[1];
 
    $backgroundColor = $_REQUEST['backgroundColor'];
 
    if($method == 'Create'){
      if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1']
        );
        }
      if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2']
        );
        }
 
        $fontfile1 = 'font/'.$text1['font'].'.ttf';
        $fontfile2 = 'font/'.$text2['font'].'.ttf';
 
        $im = ImageCreateTrueColor($width * 10, $height * 10);
 
        $bbox1 = imagettfbbox($text1['fontSize'], 0, $fontfile1, $text1['text']);
        $text1['paddingTop'] = (imagesy($im) / 2 - (abs($bbox1[7] - $bbox1[1]) / 2))/10;
        $text1['paddingLeft'] = (imagesx($im) / 2 - (abs($bbox1[2] - $bbox1[0]) / 2))/10;
 
        $bbox2 = imagettfbbox($text2['fontSize'], 0, $fontfile2, $text2['text']);
        $text2['paddingTop'] = (imagesy($im) / 2 - (abs($bbox2[7] - $bbox2[1]) / 2))/10 + 10;
        $text2['paddingLeft'] = (imagesx($im) / 2 - (abs($bbox2[2] - $bbox2[0]) / 2))/10;
 
 
    }
 
    if($method == 'left1'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'],
            'paddingLeft' => $_REQUEST['paddingLeft1'] - 5
        );
        }
      if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'],
            'paddingLeft' => $_REQUEST['paddingLeft2']
        );
        }
 
 
    }
    if($method == 'up1'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'] - 5,
            'paddingLeft' => $_REQUEST['paddingLeft1']
        );
        }
 
        if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'],
            'paddingLeft' => $_REQUEST['paddingLeft2']
        );
        }
 
    }
 
    if($method == 'down1'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'] + 5,
            'paddingLeft' => $_REQUEST['paddingLeft1']
        );
        }
        if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'],
            'paddingLeft' => $_REQUEST['paddingLeft2']
        );
        }
    }
 
    if($method == 'right1'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'] ,
            'paddingLeft' => $_REQUEST['paddingLeft1'] + 5
        );
        }
        if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'],
            'paddingLeft' => $_REQUEST['paddingLeft2']
        );
        }
    }
 
     if($method == 'left2'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'],
            'paddingLeft' => $_REQUEST['paddingLeft1']
        );
        }
      if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'],
            'paddingLeft' => $_REQUEST['paddingLeft2'] - 5
        );
        }
 
 
    }
 
    if($method == 'up2'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'],
            'paddingLeft' => $_REQUEST['paddingLeft1']
        );
        }
 
        if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'] - 5,
            'paddingLeft' => $_REQUEST['paddingLeft2']
        );
        }
 
    }
 
    if($method == 'down2'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'],
            'paddingLeft' => $_REQUEST['paddingLeft1']
        );
        }
        if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'] + 5,
            'paddingLeft' => $_REQUEST['paddingLeft2']
        );
        }
    }
 
    if($method == 'right2'){
 
        if(!empty($_REQUEST['text1'])){
        $text1 = array(
            'text' => trim($_REQUEST['text1']),
            'font' => $_REQUEST['font1'],
            'fontSize' => $_REQUEST['fontSize1'],
            'fontColor' => $_REQUEST['fontColor1'],
            'paddingTop' => $_REQUEST['paddingTop1'] ,
            'paddingLeft' => $_REQUEST['paddingLeft1']
        );
        }
        if(!empty($_REQUEST['text2'])){
        $text2 = array(
            'text' => trim($_REQUEST['text2']),
            'font' => $_REQUEST['font2'],
            'fontSize' => $_REQUEST['fontSize2'],
            'fontColor' => $_REQUEST['fontColor2'],
            'paddingTop' => $_REQUEST['paddingTop2'],
            'paddingLeft' => $_REQUEST['paddingLeft2'] + 5
        );
        }
    }
 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
  <title></title>
 
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/mColorPicker/javascripts/mColorPicker.js"></script>
<link rel="stylesheet" href="js/mColorPicker/jquery.autocomplete.css" type="text/css" />
</head>
 
<body>
<form action="" method="post">
    Size <select name="size" >
        <option value="10x50" <?php if($size == '10x50') echo 'selected' ?> >10x50</option>
        <option value="10x60" <?php if($size == '10x60') echo 'selected' ?>>10x60</option>
        <option value="12x50" <?php if($size == '12x50') echo 'selected' ?>>12x50</option>
        <option value="12x60" <?php if($size == '12x60') echo 'selected' ?>>12x60</option>
        <option value="15x50" <?php if($size == '15x50') echo 'selected' ?>>15x50</option>
        <option value="15x60" <?php if($size == '15x60') echo 'selected' ?>>15x60</option>
        <option value="20x50" <?php if($size == '20x50') echo 'selected' ?>>20x50</option>
        <option value="20x60" <?php if($size == '20x60') echo 'selected' ?>>20x60</option>
        <option value="24x50" <?php if($size == '24x50') echo 'selected' ?>>24x50</option>
        <option value="24x60" <?php if($size == '24x60') echo 'selected' ?>>24x60</option>
    </select> <br />
    Background Color <input name="backgroundColor" id="backgroundColor" type="color" value="<?=$backgroundColor;?>" data-hex="true" style="height:20px;width:80px;" class="color" /><br />
                                                                                                   <br />
    -----------------------------------------------------------------------------------------<br />
    <br />
    Text <input name="text1" type="text" value="<?=$text1['text'];?>" /><br />
    Font <select name="font1" > <option value="arial" >Arial</option></select> <br />
    <input name="paddingTop1" type="hidden" value="<?=$text1['paddingTop'];?>" />
    <input name="paddingLeft1" type="hidden" value="<?=$text1['paddingLeft'];?>" />
    Font Size <input name="fontSize1" type="text" value="<?=$text1['fontSize'];?>" /> <br />
    <?php if($method != ''){ ?>
    <input type="submit" name="method" value="left1" />  <input type="submit" name="method" value="up1" /> <input type="submit" name="method" value="down1" /> <input type="submit" name="method" value="right1" />
    <?php } ?>
    <br />
    ----------------------------------------------------------------------------------------<br />
     Text <input name="text2" type="text" value="<?=$text2['text'];?>" /><br />
    Font <select name="font2" > <option value="arial" >Arial</option></select> <br />
    <input name="paddingTop2" type="hidden" value="<?=$text2['paddingTop'];?>" />
    <input name="paddingLeft2" type="hidden" value="<?=$text2['paddingLeft'];?>" />
    Font Size <input name="fontSize2" type="text" value="<?=$text2['fontSize'];?>" /> <br />
    <?php if($method != ''){ ?>
    <input type="submit" name="method" value="left2" />  <input type="submit" name="method" value="up2" /> <input type="submit" name="method" value="down2" /> <input type="submit" name="method" value="right2" />
    <?php } ?>
    <br />
    <?php if($method == ''){ ?>
    <input type="submit" name="method" value="Create" />
    <?php } ?>
 
</form>
<br />
 
<?php
    echo $text1['paddingTop'].' | '.$text1['paddingLeft'].'<br />';
    echo $text2['paddingTop'].' | '.$text2['paddingLeft'].'<br />';
?>
<img border="0" src = "<?php echo createImage($height, $width, $backgroundColor, $text1, $text2, 'temp', 'png' ); ?>" >
 
<br /><br />
 
<a href="createPDF_en.php?image=temp.png&w=<?=$width;?>&h=<?=$height;?>" target="_blank">Create PDF</a>
</body>
</html>

主要函数

function createImage($height = 250, $width = 250, $backgroundColor = '#000000', $text1 = array('text' => 'Null', 'font' => 'arial', 'fontSize' => 10, 'fontColor' => '#FFFFFF', 'paddingTop' => 5, 'paddingLeft' => 5), $text2 = array('text' => 'Null', 'font' => 'arial', 'fontSize' => 10, 'fontColor' => '#FFFFFF', 'paddingTop' => 5, 'paddingLeft' => 5), $imageName = 'temp', $imageType = 'png' ){
    $mm2px = 10;
    // 1MM=3.2Pixel
 
    $height = $height * $mm2px;
    $width = $width * $mm2px;
 
    $text1['paddingTop'] = $text1['paddingTop'] * $mm2px;
    $text1['paddingLeft'] = $text1['paddingLeft'] * $mm2px;
 
    $text2['paddingTop'] = $text2['paddingTop'] * $mm2px;
    $text2['paddingLeft'] = $text2['paddingLeft'] * $mm2px;
 
    $fontfile1 = 'font/'.$text1['font'].'.ttf';
    $fontfile2 = 'font/'.$text2['font'].'.ttf';
 
    $im = ImageCreateTrueColor($width, $height);
 
    $white = ImageColorAllocate ($im, 255, 255, 255);
 
    $backgroundColor = substr($backgroundColor, 1,7);
    $R = base_convert(substr($backgroundColor, 0,2),16,10);
    $G = base_convert(substr($backgroundColor, 2,2),16,10);
    $B = base_convert(substr($backgroundColor, 4,2),16,10);
    $imageColor = ImageColorAllocate ($im, $R, $G, $B);
 
    $text1['fontColor'] = substr($text1['fontColor'], 1,7);
    $R = base_convert(substr($text1['fontColor'], 0,2),16,10);
    $G = base_convert(substr($text1['fontColor'], 2,2),16,10);
    $B = base_convert(substr($text1['fontColor'], 4,2),16,10);
    $fontColor1 = ImageColorAllocate ($im, $R, $G, $B);
 
    $text2['fontColor'] = substr($text2['fontColor'], 1,7);
    $R = base_convert(substr($text2['fontColor'], 0,2),16,10);
    $G = base_convert(substr($text2['fontColor'], 2,2),16,10);
    $B = base_convert(substr($text2['fontColor'], 4,2),16,10);
    $fontColor2 = ImageColorAllocate ($im, $R, $G, $B);
 
    ImageFill($im, 0, 0, $imageColor);
 
    imagettftext($im, $text1['fontSize'], 0, $text1['paddingLeft'], $text1['paddingTop'], $fontColor1, $fontfile1, $text1['text']);
    imagettftext($im, $text2['fontSize'], 0, $text2['paddingLeft'], $text2['paddingTop'], $fontColor2, $fontfile2, $text2['text']);
 
    if($imageType == 'png') {
        ImagePng($im,$imageName.'.png');
    } else if($imageType == 'gif') {
        Imagegif($im,$imageName.'.gif');
    } else if($imageType == 'jpg' || $imageType == 'jpeg') {
        imagejpeg($im,$imageName.'.'.$imageType);
    }
 
    ImageDestroy($im);
    return $imageName.'.'.$imageType;