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
main.cpp@6:f5189d4f109f, 2015-07-18 (annotated)
- Committer:
- ban4jp
- Date:
- Sat Jul 18 16:23:11 2015 +0000
- Revision:
- 6:f5189d4f109f
- Parent:
- 5:f0c0128cde62
Rewrite
Who changed what in which revision?
User | Revision | Line number | New 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 | } |