Twitter client that can be directly tweet. (Intermediate server is not required.)

Dependencies:   EthernetInterface HTTPClient-wolfSSL NTPClient OAuth4Tw mbed-rtos mbed wolfSSL

Fork of OAuth4Tw by Atsuya Okazaki

Committer:
ban4jp
Date:
Sat Jul 18 16:23:11 2015 +0000
Revision:
6:f5189d4f109f
Parent:
5:f0c0128cde62
Rewrite

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geodenx 0:00a2d3570824 1 #include <string.h>
geodenx 0:00a2d3570824 2 #include "mbed.h"
ban4jp 1:4dfa9d41f414 3 #include "EthernetInterface.h"
ban4jp 1:4dfa9d41f414 4 #include "NTPClient.h"
geodenx 0:00a2d3570824 5 #include "OAuth4Tw.h"
geodenx 0:00a2d3570824 6
ban4jp 6:f5189d4f109f 7 Serial pc(USBTX, USBRX);
geodenx 0:00a2d3570824 8 DigitalOut myled(LED1);
ban4jp 1:4dfa9d41f414 9 EthernetInterface eth;
ban4jp 1:4dfa9d41f414 10 NTPClient ntp;
ban4jp 1:4dfa9d41f414 11
ban4jp 1:4dfa9d41f414 12 OAuth4Tw oa4t("XXXXXXXXXXXXXXXXXXXXXXXXX", // Consumer key
ban4jp 1:4dfa9d41f414 13 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", // Consumer secret
ban4jp 1:4dfa9d41f414 14 "000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // Access token
ban4jp 1:4dfa9d41f414 15 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); // Access token secret
geodenx 0:00a2d3570824 16
ban4jp 5:f0c0128cde62 17 #if defined(TARGET_LPC1768)
ban4jp 6:f5189d4f109f 18 #define RESPONSE_BUFFER_SIZE 512
ban4jp 6:f5189d4f109f 19 #elif defined(TARGET_K64F) || defined(TARGET_LPC4088)
ban4jp 6:f5189d4f109f 20 #define RESPONSE_BUFFER_SIZE 4096
ban4jp 5:f0c0128cde62 21 #else
ban4jp 5:f0c0128cde62 22 #error not tested platform.
ban4jp 5:f0c0128cde62 23 #endif
ban4jp 4:fcadeb9bdcbd 24
ban4jp 6:f5189d4f109f 25 char response_buffer[RESPONSE_BUFFER_SIZE];
ban4jp 6:f5189d4f109f 26 HTTPText response(response_buffer, sizeof(response_buffer));
ban4jp 6:f5189d4f109f 27
ban4jp 6:f5189d4f109f 28 // prototype
ban4jp 6:f5189d4f109f 29 void updateTime();
ban4jp 6:f5189d4f109f 30 void example_tweet1();
ban4jp 6:f5189d4f109f 31 void example_tweet2();
ban4jp 6:f5189d4f109f 32 void example_tweet3();
ban4jp 6:f5189d4f109f 33 void example_getUserData();
ban4jp 6:f5189d4f109f 34
ban4jp 1:4dfa9d41f414 35 int main()
ban4jp 1:4dfa9d41f414 36 {
ban4jp 6:f5189d4f109f 37 pc.baud(115200);
ban4jp 6:f5189d4f109f 38
ban4jp 6:f5189d4f109f 39 eth.init(); //Use DHCP
ban4jp 6:f5189d4f109f 40 printf("Initialized, MAC: %s\n", eth.getMACAddress());
ban4jp 6:f5189d4f109f 41
ban4jp 6:f5189d4f109f 42 int ret;
ban4jp 6:f5189d4f109f 43 while ((ret = eth.connect()) != 0) {
ban4jp 6:f5189d4f109f 44 printf("Error eth.connect() - ret = %d\n", ret);
geodenx 0:00a2d3570824 45 }
geodenx 0:00a2d3570824 46
ban4jp 6:f5189d4f109f 47 printf("Connected, IP: %s, MASK: %s, GW: %s\n",
ban4jp 6:f5189d4f109f 48 eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
ban4jp 6:f5189d4f109f 49
ban4jp 6:f5189d4f109f 50 // requires accurate time, for OAuth Authorization.
ban4jp 6:f5189d4f109f 51 updateTime();
ban4jp 6:f5189d4f109f 52
ban4jp 6:f5189d4f109f 53 while (1) {
ban4jp 6:f5189d4f109f 54
ban4jp 6:f5189d4f109f 55 example_tweet1();
ban4jp 6:f5189d4f109f 56 //example_tweet2();
ban4jp 6:f5189d4f109f 57 //example_tweet3();
ban4jp 6:f5189d4f109f 58
ban4jp 6:f5189d4f109f 59 example_getUserData();
ban4jp 6:f5189d4f109f 60
ban4jp 6:f5189d4f109f 61 // Wait 60 seconds for next time.
ban4jp 6:f5189d4f109f 62 for (int t=0; t<60; t++) {
ban4jp 6:f5189d4f109f 63 myled = 1;
ban4jp 6:f5189d4f109f 64 wait(0.2);
ban4jp 6:f5189d4f109f 65 myled = 0;
ban4jp 6:f5189d4f109f 66 wait(0.8);
ban4jp 6:f5189d4f109f 67 }
ban4jp 6:f5189d4f109f 68
ban4jp 6:f5189d4f109f 69 printf("\n");
ban4jp 1:4dfa9d41f414 70 }
ban4jp 6:f5189d4f109f 71 }
ban4jp 1:4dfa9d41f414 72
ban4jp 4:fcadeb9bdcbd 73
ban4jp 6:f5189d4f109f 74 void updateTime()
ban4jp 6:f5189d4f109f 75 {
ban4jp 1:4dfa9d41f414 76 printf("Trying to update time...\n");
ban4jp 1:4dfa9d41f414 77
ban4jp 2:392b8e079c7a 78 time_t ctTime;
ban4jp 2:392b8e079c7a 79 NTPResult result;
ban4jp 2:392b8e079c7a 80
ban4jp 4:fcadeb9bdcbd 81 while (1) {
ban4jp 2:392b8e079c7a 82 result = ntp.setTime("pool.ntp.org");
ban4jp 2:392b8e079c7a 83 //result = ntp.setTime("pool.ntp.org", NTP_DEFAULT_PORT, 2000);
ban4jp 2:392b8e079c7a 84
ban4jp 2:392b8e079c7a 85 if (result == NTP_OK) {
ban4jp 2:392b8e079c7a 86 time(&ctTime);
ban4jp 2:392b8e079c7a 87 printf("Time is set to (UTC): %s\n", ctime(&ctTime));
ban4jp 2:392b8e079c7a 88 break;
ban4jp 2:392b8e079c7a 89 }
ban4jp 2:392b8e079c7a 90
ban4jp 2:392b8e079c7a 91 switch (result) {
ban4jp 2:392b8e079c7a 92 case NTP_CONN: ///<Connection error
ban4jp 2:392b8e079c7a 93 printf("Connection error\n");
ban4jp 2:392b8e079c7a 94 break;
ban4jp 2:392b8e079c7a 95 case NTP_TIMEOUT: ///<Connection timeout
ban4jp 2:392b8e079c7a 96 printf("Connection timeout\n");
ban4jp 2:392b8e079c7a 97 break;
ban4jp 2:392b8e079c7a 98 case NTP_PRTCL: ///<Protocol error
ban4jp 2:392b8e079c7a 99 printf("Protocol error\n");
ban4jp 2:392b8e079c7a 100 break;
ban4jp 2:392b8e079c7a 101 case NTP_DNS: ///<Could not resolve name
ban4jp 2:392b8e079c7a 102 printf("Could not resolve name\n");
ban4jp 2:392b8e079c7a 103 break;
ban4jp 2:392b8e079c7a 104 default:
ban4jp 2:392b8e079c7a 105 printf("Error result=%d\n", result);
ban4jp 6:f5189d4f109f 106 break;
ban4jp 2:392b8e079c7a 107 }
ban4jp 2:392b8e079c7a 108
ban4jp 2:392b8e079c7a 109 wait(5);
ban4jp 1:4dfa9d41f414 110 }
ban4jp 6:f5189d4f109f 111 }
ban4jp 1:4dfa9d41f414 112
ban4jp 4:fcadeb9bdcbd 113
ban4jp 6:f5189d4f109f 114 void example_tweet1()
ban4jp 6:f5189d4f109f 115 {
ban4jp 6:f5189d4f109f 116 const char url[] = "https://api.twitter.com/1.1/statuses/update.json"
ban4jp 6:f5189d4f109f 117 "?status=Hello World! - %s";
ban4jp 6:f5189d4f109f 118 char url2[128];
geodenx 0:00a2d3570824 119
ban4jp 6:f5189d4f109f 120 time_t ctTime;
ban4jp 6:f5189d4f109f 121 time(&ctTime);
ban4jp 4:fcadeb9bdcbd 122
ban4jp 6:f5189d4f109f 123 snprintf(url2, sizeof(url2), url, ctime(&ctTime));
ban4jp 6:f5189d4f109f 124
ban4jp 6:f5189d4f109f 125 HTTPResult result = oa4t.post(url2, &response);
ban4jp 5:f0c0128cde62 126
ban4jp 6:f5189d4f109f 127 if (result == HTTP_OK) {
ban4jp 6:f5189d4f109f 128 printf("POST success.\n%s\n", response_buffer);
ban4jp 6:f5189d4f109f 129 } else {
ban4jp 6:f5189d4f109f 130 printf("POST error. (result = %d)\n", result);
ban4jp 6:f5189d4f109f 131 }
ban4jp 6:f5189d4f109f 132 }
ban4jp 5:f0c0128cde62 133
ban4jp 6:f5189d4f109f 134 void example_tweet2()
ban4jp 6:f5189d4f109f 135 {
ban4jp 6:f5189d4f109f 136 const char url[] = "https://api.twitter.com/1.1/statuses/update.json";
ban4jp 5:f0c0128cde62 137
ban4jp 6:f5189d4f109f 138 std::vector<std::string> post;
ban4jp 6:f5189d4f109f 139 post.reserve(1);
ban4jp 6:f5189d4f109f 140
ban4jp 6:f5189d4f109f 141 char status[128];
ban4jp 4:fcadeb9bdcbd 142
ban4jp 6:f5189d4f109f 143 time_t ctTime;
ban4jp 6:f5189d4f109f 144 time(&ctTime);
ban4jp 4:fcadeb9bdcbd 145
ban4jp 6:f5189d4f109f 146 snprintf(status, sizeof(status), "status=Hello World! - %s", ctime(&ctTime));
ban4jp 6:f5189d4f109f 147 post.push_back(status);
ban4jp 4:fcadeb9bdcbd 148
ban4jp 6:f5189d4f109f 149 HTTPResult result = oa4t.post(url, &post, &response);
ban4jp 4:fcadeb9bdcbd 150
ban4jp 6:f5189d4f109f 151 if (result == HTTP_OK) {
ban4jp 6:f5189d4f109f 152 printf("POST success.\n%s\n", response_buffer);
ban4jp 6:f5189d4f109f 153 } else {
ban4jp 6:f5189d4f109f 154 printf("POST error. (result = %d)\n", result);
geodenx 0:00a2d3570824 155 }
geodenx 0:00a2d3570824 156 }
ban4jp 6:f5189d4f109f 157
ban4jp 6:f5189d4f109f 158 void example_tweet3()
ban4jp 6:f5189d4f109f 159 {
ban4jp 6:f5189d4f109f 160 const char url[] = "https://api.twitter.com/1.1/statuses/update.json";
ban4jp 6:f5189d4f109f 161
ban4jp 6:f5189d4f109f 162 std::vector<std::string> post;
ban4jp 6:f5189d4f109f 163 post.reserve(3);
ban4jp 6:f5189d4f109f 164
ban4jp 6:f5189d4f109f 165 struct tm tmptr;
ban4jp 6:f5189d4f109f 166 char tmstr[34];
ban4jp 6:f5189d4f109f 167 char status[128];
ban4jp 6:f5189d4f109f 168 char location_lat[24];
ban4jp 6:f5189d4f109f 169 char location_long[24];
ban4jp 6:f5189d4f109f 170
ban4jp 6:f5189d4f109f 171 time_t ctTime;
ban4jp 6:f5189d4f109f 172 time(&ctTime);
ban4jp 6:f5189d4f109f 173 ctTime += 9 * 60 * 60; // Timezone: JST(+9h)
ban4jp 6:f5189d4f109f 174 localtime_r(&ctTime, &tmptr);
ban4jp 6:f5189d4f109f 175
ban4jp 6:f5189d4f109f 176 // Tweets in Japanese
ban4jp 6:f5189d4f109f 177 strftime(tmstr, sizeof(tmstr), "%Y年%m月%d日 %H時%M分%S秒", &tmptr);
ban4jp 6:f5189d4f109f 178 snprintf(status, sizeof(status), "status=ハロー・ワールド! - %s", tmstr);
ban4jp 6:f5189d4f109f 179 post.push_back(status);
ban4jp 6:f5189d4f109f 180
ban4jp 6:f5189d4f109f 181 // Option: add Location information
ban4jp 6:f5189d4f109f 182 snprintf(location_lat, sizeof(location_lat), "lat=%f", 35.359577);
ban4jp 6:f5189d4f109f 183 snprintf(location_long, sizeof(location_long), "long=%f", 138.731414);
ban4jp 6:f5189d4f109f 184 post.push_back(location_lat);
ban4jp 6:f5189d4f109f 185 post.push_back(location_long);
ban4jp 6:f5189d4f109f 186
ban4jp 6:f5189d4f109f 187 HTTPResult result = oa4t.post(url, &post, &response);
ban4jp 6:f5189d4f109f 188
ban4jp 6:f5189d4f109f 189 if (result == HTTP_OK) {
ban4jp 6:f5189d4f109f 190 printf("POST success.\n%s\n", response_buffer);
ban4jp 6:f5189d4f109f 191 } else {
ban4jp 6:f5189d4f109f 192 printf("POST error. (result = %d)\n", result);
ban4jp 6:f5189d4f109f 193 }
ban4jp 6:f5189d4f109f 194 }
ban4jp 6:f5189d4f109f 195
ban4jp 6:f5189d4f109f 196 void example_getUserData()
ban4jp 6:f5189d4f109f 197 {
ban4jp 6:f5189d4f109f 198 const char url[] = "https://api.twitter.com/1.1/users/show.json"
ban4jp 6:f5189d4f109f 199 "?screen_name=twitter";
ban4jp 6:f5189d4f109f 200
ban4jp 6:f5189d4f109f 201 HTTPResult result = oa4t.get(url, &response);
ban4jp 6:f5189d4f109f 202
ban4jp 6:f5189d4f109f 203 if (result == HTTP_OK) {
ban4jp 6:f5189d4f109f 204 printf("GET success.\n%s\n", response_buffer);
ban4jp 6:f5189d4f109f 205 } else {
ban4jp 6:f5189d4f109f 206 printf("GET error. (result = %d)\n", result);
ban4jp 6:f5189d4f109f 207 }
ban4jp 6:f5189d4f109f 208 }