TwistOAuth
==========
**Warning:**
**This package is abandoned and no longer maintained. Use [mpyw/cowitter](https://github.com/mpyw/cowitter) package instead.**
Advanced PHP Twitter library.
Version 3.5.2
Requirements
============
- PHP version **5.3.2** or later
- **libcurl** (Sorry, required version is unknown)
Features
========
Basic:
- Using **GZIP compressed** connections
- Automatically decode responses
- Automatically fix weird responses
- Exception handling
- Requests for **REST** API
- Requests for **Streaming** API
- Requests using **OAuth Echo**
- Requests via **Proxy**
- Multipart requests
Abusing:
- **Asynchronous Multiple requests**
- **Asynchronous Multiple streaming**
- **Direct OAuth** authentication
Preparation
===========
### 1. Download this library
You can choose one of the following methods.
#### Direct Download
Click [here](https://github.com/mpyw/TwistOAuth/raw/master/build/TwistOAuth.phar) to save `TwistOAuth.phar` in your working directory.
#### Composer
Modify `require` directive in `composer.json`.
```json
{
"require": {
"mpyw/twistoauth": "~3.0"
}
}
```
If you choose this, replace all
```php
require __DIR__ . '/TwistOAuth.phar';
```
into
```php
require __DIR__ . '/vendor/autoload.php';
```
in examples.
### 2. Register your application
You can manage your API keys in [https://apps.twitter.com](https://apps.twitter.com/).
Now, let's register your own application.
1. Click `Create New App`
2. Fill `Name` `Description` `WebSite`.
3. Fill `Callback URL`. By default, users are redirected here after successfully authenticating.
4. Read rules and check `Yes, I agree`.
5. Click `Create your Twitter application`.
**NOTE: `localhost` is not available for Callback URL. Use `127.0.0.1` instead.**
### 3. Change application permissions
By default, you can only read tweets but cannot post tweets.
You have to configure permission settings.
1. Open detail page of your application.
2. Click `Permissions` Tab.
3. Select **`Read, Write and Access direct messages`**.
4. Click `Update settings`.
### 4. Note your *consumer\_key* and *consumer\_secret*
These parameters are identifier for **your application**.
1. Open detail page of your application.
2. Click `API Keys` Tab.
3. Note `API key` and `API secret`. They mean *consumer\_key* and *consumer\_secret*.
### 5. Generate your *access\_token* and *access\_token\_secret*
These parameters are identifier for **your account**.
1. Open detail page of your application.
2. Click `API Keys` Tab.
3. Click `Generate my access token`.
4. Note `Access token` and `Access token secret`.
Contents
========
- **[Examples](https://github.com/Certainist/TwistOAuth/blob/master/README_EXAMPLES.md)**
- **[Details](https://github.com/Certainist/TwistOAuth/blob/master/README_DETAILS.md)**
FAQ
====
- [How can I learn about Twitter API?](#how-can-i-learn-about-twitter-api)
- [Aren't there any nice authentication tools for obtaining tokens?](#arent-there-any-nice-authentication-tools-for-obtaining-tokens)
- [How do I use OAuth 2.0 authentication flow?](#how-do-i-use-oauth-20-authentication-flow)
- [What is `oauth_verifier`?](#what-is-oauth_verifier-)
- [What is `oauth_callback`?](#what-is-oauth_callback-)
- [How do I use `$to` in callback closure?](#how-do-i-use-to-in-callback-closure)
- [Are all classes immutable?](#are-all-classes-immutable)
- [Why don't you use namespace?](#why-dont-you-use-namespace)
- [Tweets are already escaped... wtf!?](#tweets-are-already-escaped-wtf)
- [User description contains unescaped `&`... wtf!?](#user-description-contains-unescaped--wtf)
- [cURL causes `SSL certificate problem` error in Windows!](#curl-causes-ssl-certificate-problem-error-in-windows)
### How can I learn about Twitter API?
Learn from documentation.
- **[REST API: endpoints](https://dev.twitter.com/rest/public)**
- **[REST API: field guides](https://dev.twitter.com/overview/api)**
- [Streaming API: endpoints and field guides](https://dev.twitter.com/streaming/overview)
Or watch actual response. The following tool is very very useful.
- **[twitSandbox](http://twitsandbox.com/)**
### Aren't there any nice authentication tools for obtaining tokens?
Try the following commandline utility.
- **[mpyw/twhelp](https://github.com/mpyw/twhelp)** **(Cross-compiled binaries)**
### How do I use OAuth 2.0 authentication flow?
Sorry, it is not available with this library. Use OAuth 1.0a instead.
### What is `oauth_verifier` ?
It is **required** for calling the following methods.
- `TwistOAuth::renewWithAccessToken()`
- `TwistOAuth::curlPostAccessToken()`
You can get it after user redirecting.
```php
$oauth_verifier = filter_input(INPUT_GET, 'oauth_verifier');
```
### What is `oauth_callback` ?
It is **not required**, but you can apply it for calling the following methods.
- `TwistOAuth::renewWithRequestToken()`
- `TwistOAuth::curlPostRequestToken()`
There are three value types.
| Name | Example Value | Authentication Type |
| :-----------: | :---------------------------------: | :------------------------------: |
| Empty String | `""` | PIN or URL (Use default setting) |
| URL | `"http://example.com/callback.php"` | URL |
| Out-Of-Band | `"oob"` | PIN |
**WARNING:**
You can only use URL if your application is configured as **Browser Application**.
This means `Callback URL` is not empty.
### How do I use `$to` in callback closure?
Use `use()`.
```php
$to->streaming('user', function ($status) use ($to) { ... });
```
### How do I ignore `TwistException` thrown?
Now your code is:
```php
try {
$to->post('statuses/update', array('status' => 'test'));
} catch (TwistException $e) { } // This is very lengthy!!!
```
To ignore all responses...
```php
curl_exec($to->curlPost('statuses/update', array('status' => 'test'))); // Wow, cool
```
### Are all classes immutable?
Yes.
```php
$a = new TwistOAuth('CK', 'CS');
$b = $a->renewWithRequestToken();
var_dump($a === $b); // false
```
However, you can change propety values by directly calling `__construct()`.
```php
$obj = new TwistOAuth('a', 'b');
$obj->__construct('c', 'd'); // Break immutable rules
```
### Why don't you use namespace?
This is because of the compatibility with previous versions of [abraham/twitteroauth](https://github.com/abraham/twitteroauth).
I believe that the prefix `Twist-` will never collide with any other libraries.
### Tweets are already escaped... wtf!?
HTML special chars in texts of statuses are already escaped by Twitter like this.
```php
$status->text = htmlspecialchars($status->text, ENT_NOQUOTES, 'UTF-8');
```
**WARNING:**
The flag is **`ENT_NOQUOTES`**, not `ENT_QUOTES` or `ENT_COMPAT`.
The following snippet may print broken HTML.
```html+php
```
You should do like this. Do not forget to set **4th** parameter into `false`.
```html+php
```
### User description contains unescaped `&`... wtf!?
HTML special chars in others are already sanitized by Twitter like this.
```php
$user->name = str_replace(array('<', '>'), '', $user->name);
$user->description = str_replace(array('<', '>'), '', $user->description);
```
**WARNING:**
`&` is not replaced into `&`.
The following snippet may print broken HTML.
```html+php
name: =$user->name?>
```
You should do like this.
```html+php
name: =htmlspecialchars($user->name, ENT_QUOTES, 'UTF-8')?>
```
### cURL causes `SSL certificate problem` error in Windows!
In the past library, this problem was done with the following solution.
```php
// You are saying, "Hey libcurl, do not certificate whether I'm really talking to Twitter."
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
```
However, it makes **vulnerability** for *[man-in-the-middle attack](http://en.wikipedia.org/wiki/Man-in-the-middle_attack)*. Your connection can be hijacked even if using the protocol `https://`. This attack can be committed in the following case.
- Some DNS servers' caches are poisoned. Refer to *[DNS spoofing](https://en.wikipedia.org/wiki/DNS_spoofing)*
- You are connecting a public access point that an attacker launched as a trap.
The right way is to download to add CA information to your computer.
1. Download [ca-bundle.crt](https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt) to save in the directory,
which path should not contain multibyte characters.
```bash
# Good
C:\ca-bundles\ca-bundles.crt
# Bad
C:\Users\田所浩二\Documents\証明書\ca-bundles.crt
```
2. Add the following definition in `php.ini`.
```ini
curl.cainfo="C:\ca-bundles\ca-bundles.crt"
```
3. Restart Apache.