⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact 8d61207fda745b896c637c2c0fac4da1cf83b398:

  • File cron.daily/twitter.php — part of check-in [1c0b6ac0e7] at 2014-12-29 14:10:00 on branch trunk — Detect other Twitter URL variations. (user: mario size: 3090)

0000: 3c 3f 70 68 70 0a 2f 2a 2a 0a 20 2a 20 61 70 69  <?php./**. * api
0010: 3a 20 63 6c 69 0a 20 2a 20 74 69 74 6c 65 3a 20  : cli. * title: 
0020: 54 77 69 74 74 65 72 20 62 72 69 64 67 65 0a 20  Twitter bridge. 
0030: 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20 50  * description: P
0040: 6f 73 74 73 20 72 65 63 65 6e 74 20 72 65 6c 65  osts recent rele
0050: 61 73 65 73 20 6f 6e 20 74 77 69 74 74 65 72 0a  ases on twitter.
0060: 20 2a 20 76 65 72 73 69 6f 6e 3a 20 30 2e 32 0a   * version: 0.2.
0070: 20 2a 20 63 61 74 65 67 6f 72 79 3a 20 72 70 63   * category: rpc
0080: 0a 20 2a 20 74 79 70 65 3a 20 63 72 6f 6e 0a 20  . * type: cron. 
0090: 2a 20 78 2d 63 72 6f 6e 3a 20 35 30 20 2a 20 2a  * x-cron: 50 * *
00a0: 20 2a 20 2a 0a 20 2a 0a 20 2a 20 53 75 6d 6d 61   * *. *. * Summa
00b0: 72 69 7a 65 20 6e 65 77 20 72 65 6c 65 61 73 65  rize new release
00c0: 73 20 66 6f 72 20 54 77 69 74 74 65 72 20 66 65  s for Twitter fe
00d0: 65 64 2e 0a 20 2a 20 43 75 72 72 65 6e 74 6c 79  ed.. * Currently
00e0: 20 75 73 69 6e 67 20 60 74 77 69 64 67 65 60 20   using `twidge` 
00f0: 28 70 72 65 2d 63 6f 6e 66 69 67 75 72 65 64 20  (pre-configured 
0100: 69 6e 20 24 48 4f 4d 45 29 2c 0a 20 2a 20 77 68  in $HOME),. * wh
0110: 69 63 68 20 64 6f 65 73 6e 27 74 20 73 75 70 70  ich doesn't supp
0120: 6f 72 74 20 2f 2f 74 2e 63 6f 2f 20 69 6e 6c 69  ort //t.co/ inli
0130: 6e 65 20 69 6d 61 67 65 73 20 79 65 74 2e 0a 20  ne images yet.. 
0140: 2a 0a 20 2a 2f 0a 0a 0a 63 68 64 69 72 28 64 69  *. */...chdir(di
0150: 72 6e 61 6d 65 28 5f 5f 44 49 52 5f 5f 29 29 3b  rname(__DIR__));
0160: 0a 69 6e 63 6c 75 64 65 28 22 63 6f 6e 66 69 67  .include("config
0170: 2e 70 68 70 22 29 3b 0a 0a 0a 0a 2f 2a 2a 0a 20  .php");..../**. 
0180: 2a 20 52 65 6c 65 61 73 65 73 20 77 69 74 68 69  * Releases withi
0190: 6e 20 74 68 65 20 6c 61 73 74 20 68 6f 75 72 0a  n the last hour.
01a0: 20 2a 0a 20 2a 2f 0a 24 72 65 6c 20 3d 20 64 62   *. */.$rel = db
01b0: 28 22 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 0a  (".    SELECT *.
01c0: 20 20 20 20 20 20 46 52 4f 4d 20 72 65 6c 65 61        FROM relea
01d0: 73 65 5f 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  se_versions.    
01e0: 20 57 48 45 52 45 20 74 5f 70 75 62 6c 69 73 68   WHERE t_publish
01f0: 65 64 20 3e 3d 20 3f 0a 20 20 20 20 22 2c 20 74  ed >= ?.    ", t
0200: 69 6d 65 28 29 2d 31 31 32 30 30 0a 29 2d 3e 66  ime()-11200.)->f
0210: 65 74 63 68 41 6c 6c 28 29 3b 0a 0a 0a 0a 2f 2f  etchAll();....//
0220: 20 71 75 65 72 79 20 72 65 63 65 6e 74 2f 70 72   query recent/pr
0230: 65 76 69 6f 75 73 20 73 74 61 74 75 73 20 6d 65  evious status me
0240: 73 73 61 67 65 73 0a 24 70 72 65 76 20 3d 20 74  ssages.$prev = t
0250: 77 75 72 6c 28 22 73 74 61 74 75 73 65 73 2f 75  wurl("statuses/u
0260: 73 65 72 5f 74 69 6d 65 6c 69 6e 65 2e 6a 73 6f  ser_timeline.jso
0270: 6e 3f 63 6f 75 6e 74 3d 33 30 22 29 3b 0a 24 70  n?count=30");.$p
0280: 72 65 76 20 3d 20 74 77 75 72 6c 5f 74 65 78 74  rev = twurl_text
0290: 5f 75 72 6c 73 28 24 70 72 65 76 29 3b 0a 70 72  _urls($prev);.pr
02a0: 69 6e 74 20 24 70 72 65 76 3b 0a 0a 2f 2f 20 63  int $prev;..// c
02b0: 6f 6e 64 65 6e 73 65 20 69 6e 64 69 76 69 64 75  ondense individu
02c0: 61 6c 20 74 77 65 65 74 73 0a 66 6f 72 65 61 63  al tweets.foreac
02d0: 68 20 28 24 72 65 6c 20 61 73 20 24 72 6f 77 29  h ($rel as $row)
02e0: 20 7b 0a 0a 20 20 20 20 2f 2f 20 73 6b 69 70 20   {..    // skip 
02f0: 65 78 69 73 74 69 6e 67 0a 20 20 20 20 69 66 20  existing.    if 
0300: 28 74 77 65 65 74 5f 65 78 69 73 74 73 28 24 70  (tweet_exists($p
0310: 72 65 76 2c 20 24 72 6f 77 29 29 20 7b 0a 20 20  rev, $row)) {.  
0320: 20 20 20 20 20 20 70 72 69 6e 74 20 22 73 6b 69        print "ski
0330: 70 28 24 72 6f 77 5b 6e 61 6d 65 5d 29 20 22 3b  p($row[name]) ";
0340: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
0350: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  e;.    }.    .  
0360: 20 20 2f 2f 20 68 6f 6d 65 70 61 67 65 0a 20 20    // homepage.  
0370: 20 20 69 66 20 28 65 6d 70 74 79 28 24 72 6f 77    if (empty($row
0380: 5b 22 68 6f 6d 65 70 61 67 65 22 5d 29 20 6f 72  ["homepage"]) or
0390: 20 73 74 72 6c 65 6e 28 24 72 6f 77 5b 22 68 6f   strlen($row["ho
03a0: 6d 65 70 61 67 65 22 5d 20 3e 20 38 30 29 29 20  mepage"] > 80)) 
03b0: 7b 0a 20 20 20 20 20 20 20 20 24 72 6f 77 5b 22  {.        $row["
03c0: 68 6f 6d 65 70 61 67 65 22 5d 20 3d 20 22 68 74  homepage"] = "ht
03d0: 74 70 3a 2f 2f 66 72 65 73 68 63 6f 64 65 2e 63  tp://freshcode.c
03e0: 6c 75 62 2f 70 72 6f 6a 65 63 74 73 2f 24 72 6f  lub/projects/$ro
03f0: 77 5b 6e 61 6d 65 5d 22 3b 0a 20 20 20 20 7d 0a  w[name]";.    }.
0400: 0a 20 20 20 20 2f 2f 20 70 72 65 70 61 72 65 20  .    // prepare 
0410: 70 6f 73 74 0a 20 20 20 20 24 6d 73 67 20 3d 20  post.    $msg = 
0420: 22 24 72 6f 77 5b 74 69 74 6c 65 5d 20 24 72 6f  "$row[title] $ro
0430: 77 5b 76 65 72 73 69 6f 6e 5d 20 72 65 6c 65 61  w[version] relea
0440: 73 65 64 2e 20 24 72 6f 77 5b 68 6f 6d 65 70 61  sed. $row[homepa
0450: 67 65 5d 22 3b 0a 20 20 20 20 24 6d 73 67 20 3d  ge]";.    $msg =
0460: 20 70 72 65 67 5f 72 65 70 6c 61 63 65 28 22 2f   preg_replace("/
0470: 5c 73 2b 2f 22 2c 20 22 20 22 2c 20 24 6d 73 67  \s+/", " ", $msg
0480: 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2f 20 63  );.    .    // c
0490: 68 65 63 6b 20 66 6f 72 20 70 72 6f 6a 65 63 74  heck for project
04a0: 20 54 77 69 74 74 65 72 3d 20 55 52 4c 2c 20 61   Twitter= URL, a
04b0: 64 64 20 40 6d 65 6e 74 69 6f 6e 0a 20 20 20 20  dd @mention.    
04c0: 69 66 20 28 70 72 65 67 5f 6d 61 74 63 68 28 22  if (preg_match("
04d0: 7e 68 74 74 70 73 3f 3a 2f 2f 28 3f 3a 77 77 77  ~https?://(?:www
04e0: 5c 2e 29 3f 74 77 69 74 74 65 72 2e 63 6f 6d 2f  \.)?twitter.com/
04f0: 40 3f 28 5c 77 7b 32 2c 31 35 7d 29 7e 22 2c 20  @?(\w{2,15})~", 
0500: 24 72 6f 77 5b 22 75 72 6c 73 22 5d 2c 20 24 75  $row["urls"], $u
0510: 75 29 29 20 7b 0a 20 20 20 20 20 20 20 20 24 6d  u)) {.        $m
0520: 73 67 20 2e 3d 20 22 20 40 24 75 75 5b 31 5d 22  sg .= " @$uu[1]"
0530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
0540: 20 2f 2f 20 61 64 64 20 74 61 67 73 0a 20 20 20   // add tags.   
0550: 20 24 74 61 67 73 20 3d 20 70 5f 63 73 76 28 24   $tags = p_csv($
0560: 72 6f 77 5b 22 74 61 67 73 22 5d 29 3b 0a 20 20  row["tags"]);.  
0570: 20 20 73 68 75 66 66 6c 65 28 24 74 61 67 73 29    shuffle($tags)
0580: 3b 0a 20 20 20 20 66 6f 72 65 61 63 68 20 28 61  ;.    foreach (a
0590: 72 72 61 79 5f 73 6c 69 63 65 28 24 74 61 67 73  rray_slice($tags
05a0: 2c 20 30 2c 20 35 29 20 61 73 20 24 74 61 67 29  , 0, 5) as $tag)
05b0: 20 7b 0a 20 20 20 20 20 20 20 20 24 74 61 67 20   {.        $tag 
05c0: 3d 20 70 72 65 67 5f 72 65 70 6c 61 63 65 28 22  = preg_replace("
05d0: 2f 5e 28 5c 77 29 5c 2b 5c 2b 2f 22 2c 20 22 5c  /^(\w)\+\+/", "\
05e0: 5c 31 70 70 22 2c 20 24 74 61 67 29 3b 0a 20 20  \1pp", $tag);.  
05f0: 20 20 20 20 20 20 24 74 61 67 20 3d 20 70 72 65        $tag = pre
0600: 67 5f 72 65 70 6c 61 63 65 28 22 2f 2d 2f 22 2c  g_replace("/-/",
0610: 20 22 5f 22 2c 20 24 74 61 67 29 3b 0a 20 20 20   "_", $tag);.   
0620: 20 20 20 20 20 24 6d 73 67 20 2e 3d 20 22 20 23       $msg .= " #
0630: 24 74 61 67 22 3b 0a 20 20 20 20 7d 0a 20 20 20  $tag";.    }.   
0640: 20 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 66   .    // check f
0650: 6f 72 20 74 77 65 65 74 20 73 69 7a 65 20 6c 69  or tweet size li
0660: 6d 69 74 20 28 31 34 30 20 6d 69 6e 75 73 20 55  mit (140 minus U
0670: 52 4c 2d 6c 65 6e 67 74 68 20 5b 32 32 5d 20 66  RL-length [22] f
0680: 6f 72 20 61 70 70 65 6e 64 65 64 20 69 6d 61 67  or appended imag
0690: 65 29 0a 20 20 20 20 77 68 69 6c 65 20 28 74 77  e).    while (tw
06a0: 65 65 74 5f 6c 65 6e 67 74 68 28 24 6d 73 67 29  eet_length($msg)
06b0: 20 3e 20 31 31 38 29 20 7b 0a 20 20 20 20 20 20   > 118) {.      
06c0: 20 20 24 6d 73 67 20 3d 20 70 72 65 67 5f 72 65    $msg = preg_re
06d0: 70 6c 61 63 65 28 22 2f 5c 73 5c 53 2b 24 2f 73  place("/\s\S+$/s
06e0: 22 2c 20 22 22 2c 20 24 6d 73 67 29 3b 0a 20 20  ", "", $msg);.  
06f0: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2f 20    }.    .    // 
0700: 73 65 6e 64 0a 20 20 20 20 70 72 69 6e 74 5f 72  send.    print_r
0710: 28 22 5c 6e 74 77 65 65 74 28 24 6d 73 67 29 20  ("\ntweet($msg) 
0720: 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 5f 72 28  ");.    print_r(
0730: 74 77 75 72 6c 5f 77 69 74 68 5f 69 6d 67 28 24  twurl_with_img($
0740: 6d 73 67 2c 20 22 69 6d 67 2f 73 63 72 65 65 6e  msg, "img/screen
0750: 73 68 6f 74 2f 24 72 6f 77 5b 6e 61 6d 65 5d 2e  shot/$row[name].
0760: 6a 70 65 67 22 29 29 3b 0a 7d 0a 70 72 69 6e 74  jpeg"));.}.print
0770: 20 22 5c 6e 22 3b 0a 0a 0a 0a 2f 2a 2a 0a 20 2a   "\n";..../**. *
0780: 20 74 77 75 72 6c 20 41 50 49 0a 20 2a 0a 20 2a   twurl API. *. *
0790: 2f 0a 66 75 6e 63 74 69 6f 6e 20 74 77 75 72 6c  /.function twurl
07a0: 28 24 61 70 69 29 20 7b 0a 20 20 20 72 65 74 75  ($api) {.   retu
07b0: 72 6e 20 6a 73 6f 6e 5f 64 65 63 6f 64 65 28 65  rn json_decode(e
07c0: 78 65 63 28 22 74 77 75 72 6c 20 27 2f 31 2e 31  xec("twurl '/1.1
07d0: 2f 24 61 70 69 27 22 29 2c 20 54 52 55 45 29 3b  /$api'"), TRUE);
07e0: 0a 7d 0a 0a 0a 2f 2a 2a 0a 20 2a 20 53 65 6e 64  .}.../**. * Send
07f0: 20 4d 53 47 2b 49 4d 47 20 76 69 61 20 74 77 75   MSG+IMG via twu
0800: 72 6c 0a 20 2a 0a 20 2a 2f 0a 66 75 6e 63 74 69  rl. *. */.functi
0810: 6f 6e 20 74 77 75 72 6c 5f 77 69 74 68 5f 69 6d  on twurl_with_im
0820: 67 28 24 6d 73 67 2c 20 24 69 6d 67 29 20 7b 0a  g($msg, $img) {.
0830: 20 20 20 24 6d 73 67 20 3d 20 65 73 63 61 70 65     $msg = escape
0840: 73 68 65 6c 6c 61 72 67 28 24 6d 73 67 29 3b 0a  shellarg($msg);.
0850: 20 20 20 72 65 74 75 72 6e 20 65 78 65 63 28 22     return exec("
0860: 74 77 75 72 6c 20 2d 58 20 50 4f 53 54 20 27 2f  twurl -X POST '/
0870: 31 2e 31 2f 73 74 61 74 75 73 65 73 2f 75 70 64  1.1/statuses/upd
0880: 61 74 65 5f 77 69 74 68 5f 6d 65 64 69 61 2e 6a  ate_with_media.j
0890: 73 6f 6e 27 20 2d 2d 66 69 6c 65 20 24 69 6d 67  son' --file $img
08a0: 20 2d 2d 66 69 6c 65 2d 66 69 65 6c 64 20 27 6d   --file-field 'm
08b0: 65 64 69 61 5b 5d 27 20 2d 64 20 73 74 61 74 75  edia[]' -d statu
08c0: 73 3d 24 6d 73 67 22 29 3b 0a 7d 0a 0a 0a 2f 2a  s=$msg");.}.../*
08d0: 2a 0a 20 2a 20 43 61 6c 63 75 6c 61 74 65 20 74  *. * Calculate t
08e0: 77 65 65 74 20 73 69 7a 65 20 77 69 74 68 6f 75  weet size withou
08f0: 74 20 55 52 4c 73 2e 0a 20 2a 20 0a 20 2a 2f 0a  t URLs.. * . */.
0900: 66 75 6e 63 74 69 6f 6e 20 74 77 65 65 74 5f 6c  function tweet_l
0910: 65 6e 67 74 68 28 24 6d 73 67 29 20 7b 0a 20 20  ength($msg) {.  
0920: 20 20 24 6d 73 67 20 3d 20 70 72 65 67 5f 72 65    $msg = preg_re
0930: 70 6c 61 63 65 28 22 7e 68 74 74 70 3a 2f 2f 5c  place("~http://\
0940: 53 2b 28 3f 3c 21 5b 2c 2e 5d 29 7e 22 2c 20 22  S+(?<![,.])~", "
0950: 68 74 74 70 3a 2f 2f 74 2e 63 6f 2f 61 62 63 44  http://t.co/abcD
0960: 45 46 47 48 49 4a 22 2c 20 24 6d 73 67 29 3b 0a  EFGHIJ", $msg);.
0970: 20 20 20 20 72 65 74 75 72 6e 20 73 74 72 6c 65      return strle
0980: 6e 28 24 6d 73 67 29 3b 0a 20 20 20 20 0a 7d 0a  n($msg);.    .}.
0990: 0a 0a 2f 2a 2a 0a 20 2a 20 43 6f 6c 6c 65 63 74  ../**. * Collect
09a0: 20 60 74 65 78 74 3a 60 20 61 6e 64 20 60 65 78   `text:` and `ex
09b0: 70 61 6e 64 65 64 5f 75 72 6c 73 3a 60 0a 20 2a  panded_urls:`. *
09c0: 0a 20 2a 2f 0a 66 75 6e 63 74 69 6f 6e 20 74 77  . */.function tw
09d0: 75 72 6c 5f 74 65 78 74 5f 75 72 6c 73 28 24 6a  url_text_urls($j
09e0: 73 6f 6e 2c 20 24 74 65 78 74 3d 22 22 29 20 7b  son, $text="") {
09f0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 28 24 6a  .    foreach ($j
0a00: 73 6f 6e 20 61 73 20 24 74 77 65 65 74 29 20 7b  son as $tweet) {
0a10: 0a 20 20 20 20 20 20 20 20 24 74 65 78 74 20 2e  .        $text .
0a20: 3d 20 22 7b 24 74 77 65 65 74 5b 27 74 65 78 74  = "{$tweet['text
0a30: 27 5d 7d 20 e2 86 92 20 7b 24 74 77 65 65 74 5b  ']} ... {$tweet[
0a40: 27 65 6e 74 69 74 69 65 73 27 5d 5b 27 75 72 6c  'entities']['url
0a50: 73 27 5d 5b 30 5d 5b 27 65 78 70 61 6e 64 65 64  s'][0]['expanded
0a60: 5f 75 72 6c 27 5d 7d 5c 6e 22 3b 0a 20 20 20 20  _url']}\n";.    
0a70: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 74 65  }.    return $te
0a80: 78 74 3b 0a 7d 0a 2f 2f 20 43 6f 6d 70 61 72 65  xt;.}.// Compare
0a90: 20 74 69 74 6c 65 73 20 61 6e 64 20 68 6f 6d 65   titles and home
0aa0: 70 61 67 65 20 6c 69 6e 6b 73 20 77 69 74 68 20  page links with 
0ab0: 70 72 65 76 69 6f 75 73 20 66 65 65 64 73 2e 0a  previous feeds..
0ac0: 66 75 6e 63 74 69 6f 6e 20 74 77 65 65 74 5f 65  function tweet_e
0ad0: 78 69 73 74 73 28 24 70 72 65 76 2c 20 24 72 6f  xists($prev, $ro
0ae0: 77 29 20 7b 0a 20 20 20 20 23 20 65 73 63 61 70  w) {.    # escap
0af0: 65 0a 20 20 20 20 24 74 69 74 6c 65 20 3d 20 70  e.    $title = p
0b00: 72 65 67 5f 71 75 6f 74 65 28 24 72 6f 77 5b 22  reg_quote($row["
0b10: 74 69 74 6c 65 22 5d 2c 20 22 7e 22 29 3b 0a 20  title"], "~");. 
0b20: 20 20 20 24 68 6f 6d 65 70 61 67 65 20 3d 20 70     $homepage = p
0b30: 72 65 67 5f 71 75 6f 74 65 28 24 72 6f 77 5b 22  reg_quote($row["
0b40: 68 6f 6d 65 70 61 67 65 22 5d 2c 20 22 7e 22 29  homepage"], "~")
0b50: 0a 20 20 20 20 6f 72 20 24 68 6f 6d 65 70 61 67  .    or $homepag
0b60: 65 20 3d 20 22 68 74 74 70 3a 2f 2f 66 72 65 73  e = "http://fres
0b70: 68 63 6f 64 65 2e 63 6c 75 62 2f 70 72 6f 6a 65  hcode.club/proje
0b80: 63 74 73 2f 24 72 6f 77 5b 6e 61 6d 65 5d 22 3b  cts/$row[name]";
0b90: 0a 20 20 20 20 23 20 63 68 65 63 6b 20 6d 65 6e  .    # check men
0ba0: 74 69 6f 6e 73 0a 20 20 20 20 72 65 74 75 72 6e  tions.    return
0bb0: 0a 20 20 20 20 20 20 20 20 70 72 65 67 5f 6d 61  .        preg_ma
0bc0: 74 63 68 28 22 7e 5e 24 74 69 74 6c 65 7e 6d 69  tch("~^$title~mi
0bd0: 22 2c 20 24 70 72 65 76 29 0a 20 20 20 20 20 20  ", $prev).      
0be0: 6f 72 0a 20 20 20 20 20 20 20 20 70 72 65 67 5f  or.        preg_
0bf0: 6d 61 74 63 68 28 22 7e 24 68 6f 6d 65 70 61 67  match("~$homepag
0c00: 65 7e 22 2c 20 24 70 72 65 76 29 3b 0a 7d 0a 0a  e~", $prev);.}..
0c10: 3f 3e                                            ?>