Facebook Comment정보를 Json 형태로 가져온다.
1. Json 형태로 Comment정보를 가져오기
2. Json 형태의 데이터를 PHP형태로 변환
3. DB에 저장
크게 이렇게 세가지 순서로 하면 된다.
JSON Data
[
{
"created_time": "2018-09-06T23:20:50+0000",
"from": {
"name": "Isaac Hwang",
"id": "478965352583677"
},
"message": "\"2019 산타페 무비나잇\" LA",
"id": "1956676224375962_1956679077709010"
},
{
"created_time": "2018-09-06T23:26:34+0000",
"from": {
"name": "Soozi Kim",
"id": "2307385399289900"
},
"message": "\"2019 산타페 무비나잇\" Buena Park
Aiden Jo",
"id": "1956676224375962_1956686247708293"
},
{
"created_time": "2018-09-06T23:33:44+0000",
"from": {
"name": "Jenny Kim",
"id": "2107742849249620"
},
"message": "\"2019 산타페 무비나잇\" LA
David Kwonsoo Kim",
"id": "1956676224375962_1956690967707821"
},
{
"created_time": "2018-09-06T23:34:35+0000",
"from": {
"name": "Jay Park",
"id": "2107742849249621"
},
"message": "\"2019 산타페 무비나잇\" LA
Jeny Lee",
"id": "1956676224375962_1956691477707770"
},
{
"created_time": "2018-09-06T23:37:24+0000",
"from": {
"name": "Yong Chang",
"id": "10215680417339918"
},
"message": "\"2019 산타페 무비나잇\" Buena Park
Hyun Ae Lee",
"id": "1956676224375962_1956693064374278"
}
]
예를 들어서 이런식으로 Facebook에 Comments의 정보들을 가져오게 된다. (페이스북에서 제공)
이러한 정보들을 복사해서 만들어 놓은 마이크로 페이지에 Textarea를 만들어서 붙여넣는다.
<form action="<?=$_SERVER["PHP_SELF"];?>" method="post">
<textarea id="json" name="json" style="width:80%;max-width: 800px; height: 400px;"></textarea>
<input type="submit" name="jsonform" value="Submit">
</form>
<form>태그를 이용해 Json을 입력할 수 있는 Textarea를 만든다. form 형태로 만들었기 때문에 action을 통해 다른 페이지로 보내서 파일을 따로 저장할 수도 있지만 PHP를 이용해 자체페이지에서 받을 수도 있다.
<?=$_SERVER["PHP_SELF"];?>
이것을 이용하면 다른 파일로 넘기는 것이 아니라 자체페이지로 다시 받아올 수 있다.
HTML파일형식은 위와같이 넣어 전체적인 포맷을 잡고 Textarea아래에 PHP를 넣는다.
PHP를 이용해 DB연결
<?
//mysql 연결
$servername = "localhost";
$username = "USERNAME";
$password = "PASSWORD";
$dbname = "DATABASENAME";
$table = "TABLENAME";
$conn = new mysqli($servername, $username, $password, $dbname);
mysqli_set_charset($conn,"utf8");
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
.
.
.
.
$conn->close();
?>
PHP문을 넣어 DB와도 연결을 하고 Json으로 받아온 데이터를 PHP 배열로 바꾸어 DB에 저장하려고 한다.
PHP를 이용해서 DB를 연결하는 부분이다.
처음엔 $conn = mysql_connect($servername, $username, $password, $dbname);
이라고 했었는데 요즘엔(2018.09) 속도 및 사용성 등으로 인해 mysqli를 더 많이 쓴다고 한다.
new mysqli 로 연결하는 방법은 객체 지향적인 방법이다.
mysqli_set_charset으로 한글깨짐을 방지한다. 문자를 UTF-8로 받아온다.
if문을 사용해 연결이 정상적으로 되었는지를 관찰한다. connect_error가 나면 메세지를 띄운다.
php의 마지막 부분에 close()함수를 써서 connect를 끊어주어야 한다.
Json Data 가져오기
function getJsonText($jsontext) { //"message"사이에 \ 표시된것들 지우는 Function
return str_replace("\\\"", "", $jsontext);
}
$jsondata=getJsonText($_POST['json']);
echo "<br><br>";
echo "Json 문자열출력:<br>";
var_dump($jsondata); //Json형식으로 변환
$jsonArr = json_decode(preg_replace('/([\\x00-\\x1f\\x7f\\xff]+)/', ' ', $jsondata), true );
//한글깨짐 해결
받아온 Json 데이터를 보면 message들 사이사이에 \가 포함이 되어있는것을 볼 수 있다.
이것은 영문도아니고, 한글도아니고, 특수문자이므로 전달이 안될 수 있다.
따라서 \(특수문자)를 지워줘야 하기 때문에 특수문자를 지우는 함수를 만들었다.
getJsonText라는 함수 사용.
$_POST['json'];
-> textarea의 name이 json이므로 json이란 이름을 가진 textarea의 값을 그대로 가져온다.
var_dump($jsondata);
-> 출력하는 var_dump함수이다. json값을 제대로 가지고 왔는지 확인하는 함수이다.
$json_decode( $jsondata, true);
-> 뒤에 true 를 붙여주면 json data를 php 배열로 만들어준다. (true를 안붙이면 그냥 object로 만들어준다)
->받아온 $jsondata에서 한글, 영문, 숫자를 모두 그대로 받아오게 하기 위해 preg_replace함수를 써서 한글, 영문, 숫자 이외는 "띄어쓰기"로 대체하는 함수를 쓴다.
preg_replace('/([\\x00-\\x1f\\x7f\\xff]+)/', ' ', $jsondata)
JSON 문자열 출력 :
string(1557) "[ { "created_time": "2018-09-06T23:20:50+0000", "from": { "name": "Isaac Hwang", "id": "478965352583677" }, "message": "2019 산타페 무비나잇 LA", "id": "1956676224375962_1956679077709010" }, { "created_time": "2018-09-06T23:26:34+0000", "from": { "name": "Soozi Kim", "id": "2307385399289900" }, "message": "2019 산타페 무비나잇 Buena Park Aiden Jo", "id": "1956676224375962_1956686247708293" }, { "created_time": "2018-09-06T23:33:44+0000", "from": { "name": "Jenny Kim", "id": "2107742849249620" }, "message": "2019 산타페 무비나잇 LA David Kwonsoo Kim", "id": "1956676224375962_1956690967707821" }, { "created_time": "2018-09-06T23:34:35+0000", "from": { "name": "Jay Park", "id": "2107742849249621" }, "message": "2019 산타페 무비나잇 LA Jeny Lee", "id": "1956676224375962_1956691477707770" }, { "created_time": "2018-09-06T23:37:24+0000", "from": { "name": "Yong Chang", "id": "10215680417339918" }, "message": "2019 산타페 무비나잇 Buena Park Hyun Ae Lee", "id": "1956676224375962_1956693064374278" } ]"
PHP 배열 출력 :
array(5) { [0]=> array(4) { ["created_time"]=> string(24) "2018-09-06T23:20:50+0000" ["from"]=> array(2) { ["name"]=> string(11) "Isaac Hwang" ["id"]=> string(15) "478965352583677" } ["message"]=> string(30) "2019 산타페 무비나잇 LA" ["id"]=> string(33) "1956676224375962_1956679077709010" } [1]=> array(4) { ["created_time"]=> string(24) "2018-09-06T23:26:34+0000" ["from"]=> array(2) { ["name"]=> string(9) "Soozi Kim" ["id"]=> string(16) "2307385399289900" } ["message"]=> string(47) "2019 산타페 무비나잇 Buena Park Aiden Jo" ["id"]=> string(33) "1956676224375962_1956686247708293" } [2]=> array(4) { ["created_time"]=> string(24) "2018-09-06T23:33:44+0000" ["from"]=> array(2) { ["name"]=> string(9) "Jenny Kim" ["id"]=> string(16) "2107742849249620" } ["message"]=> string(48) "2019 산타페 무비나잇 LA David Kwonsoo Kim" ["id"]=> string(33) "1956676224375962_1956690967707821" } [3]=> array(4) { ["created_time"]=> string(24) "2018-09-06T23:34:35+0000" ["from"]=> array(2) { ["name"]=> string(8) "Jay Park" ["id"]=> string(16) "2107742849249621" } ["message"]=> string(39) "2019 산타페 무비나잇 LA Jeny Lee" ["id"]=> string(33) "1956676224375962_1956691477707770" } [4]=> array(4) { ["created_time"]=> string(24) "2018-09-06T23:37:24+0000" ["from"]=> array(2) { ["name"]=> string(10) "Yong Chang" ["id"]=> string(17) "10215680417339918" } ["message"]=> string(50) "2019 산타페 무비나잇 Buena Park Hyun Ae Lee" ["id"]=> string(33) "1956676224375962_1956693064374278" } }
반복문을 통해 데이터 가져오기
foreach($jsonArr as $item){
$name=explode(' ',$item['from']['name']); //first name / last name 분리
$fname = $name[0];
$lname = end($name);
$message = $item['message'];
$time = strtotime($item['created_time']);
echo $fname."<br>";
echo $lname."<br>";
echo $message."<br>";
echo $time."<br><br>";
$insertArr[] = "('".$fname."','".$lname."','".$message."','fb','kr','".$time."')";
}
가져온 데이터를 확인해보는 코드이다. echo를 통해 출력해본다.
이름부분은 성(lname) 과 이름(fname)부분이 연결되어 받아오기 때문에 끊어서 나눠 받아야 한다. 따라서 explode()라는 함수를 사용하여 띄어쓰기를 기준으로 자른다.
이름(fname)부분은 제일 앞부분이 되게 하고 성(lname)은 배열의 가장 끝부분을 나타내게 하면 된다. end()함수를 사용해서 가장 끝부분의 배열을 가져온다.
insert해야할 values값을 배열로 만든다.
DATA를 DB에 INSERT 하기
echo "<pre>";
print_r($insertArr);
echo "</pre>";
$insertVal = implode(',', $insertArr);
$sql="INSERT IGNORE INTO santafe_messages (fname,lname,message,location,lang,time) VALUES ".$insertVal;
echo $sql;
mysqli_query($conn,$sql);
<pre>태그는 입력한 값을 그대로 가져오는것이다.
print_r함수를 이용해 $insertArr 값에 어떻게 저장되었는지 볼 수 있는 부분이다.
Array ( [0] => ('Isaac','Hwang','2019 산타페 무비나잇 LA','fb','kr','1536276050') [1] => ('Soozi','Kim','2019 산타페 무비나잇 Buena Park Aiden Jo','fb','kr','1536276394') [2] => ('Jenny','Kim','2019 산타페 무비나잇 LA David Kwonsoo Kim','fb','kr','1536276824') [3] => ('Jay','Park','2019 산타페 무비나잇 LA Jeny Lee','fb','kr','1536276875') [4] => ('Yong','Chang','2019 산타페 무비나잇 Buena Park Hyun Ae Lee','fb','kr','1536277044') )
이런식으로 저장이 되어있는것을 볼 수 있다.
다음으로 $insertVal 이라는 변수를 두어 implode()를 이용해 값들을 합친다. explode()로 분리했다면 이번엔 합치는 함수이다. 0번째, 1번째, 2번째 배열들을 ,를 이용해서 다 붙인것처럼 나오게 된다.
('Isaac','Hwang','2019 산타페 무비나잇 LA','fb','kr','1536276050'),('Soozi','Kim','2019 산타페 무비나잇 Buena Park Aiden Jo','fb','kr','1536276394'),('Jenny','Kim','2019 산타페 무비나잇 LA David Kwonsoo Kim','fb','kr','1536276824'),('Jay','Park','2019 산타페 무비나잇 LA Jeny Lee','fb','kr','1536276875'),('Yong','Chang','2019 산타페 무비나잇 Buena Park Hyun Ae Lee','fb','kr','1536277044')
이런식으로 나오게 된다.
이제 DB에 넣는다.
$sql 이라는 변수를 만들고
"INSERT IGNORE INTO santafe_messages (fname,lname,message,location,lang,time) VALUES ".$insertVal;
아까 , 로 붙여두었던 values 값들($insertVal)을 가져와 붙인다.
그러면 한번에 많은 값들이 INSERT되게 된다. 여기서 원래 들어있던 값들도 있을수 있으므로 INSERT 뒤에 IGNORE를 붙여서 똑같은것들은 제외하고 넣는다. 이때 기준은 message와 time으로 잡는다.
INSERT IGNORE INTO santafe_messages (fname,lname,message,location,lang,time) VALUES ('Isaac','Hwang','2019 산타페 무비나잇 LA','fb','kr','1536276050'),('Soozi','Kim','2019 산타페 무비나잇 Buena Park Aiden Jo','fb','kr','1536276394'),('Jenny','Kim','2019 산타페 무비나잇 LA David Kwonsoo Kim','fb','kr','1536276824'),('Jay','Park','2019 산타페 무비나잇 LA Jeny Lee','fb','kr','1536276875'),('Yong','Chang','2019 산타페 무비나잇 Buena Park Hyun Ae Lee','fb','kr','1536277044')
mysqli_query() 함수를 이용해 DB에 넣는다.
전체 코드
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<form action="<?=$_SERVER["PHP_SELF"];?>" method="post">
Post# sample: 1392407924136131<br>
Post#: <input type="text" id="postnum" name="postnum"><input type="submit" name="postnumform" value="CREATE LINK">
</form>
<br>
<?
header('Content-Type: text/html; charset=utf-8');
// https://developers.facebook.com/tools/explorer/
// 1135664443143815/comments?pretty=0&fields=from&limit=300
if(isset($_POST["postnumform"]))
echo '<a href="https://developers.facebook.com/tools/explorer/?method=GET&path='.$_POST['postnum'].'%2Fcomments%3Fpretty%3D0%26fields%3Dfrom%26limit%3D250&version=v2.8" target="_blank">OPEN LINK</a>';
else if(isset($_POST["jsonform"]))
echo urlencode($_POST["jsonform"]);
echo "<br><br><br>";
$array = json_decode($_POST['json']);
$i=1;
print_r($array);
?>
<br><br><br>
<form action="<?=$_SERVER["PHP_SELF"];?>" method="post">
<textarea id="json" name="json" style="width:80%;max-width: 800px; height: 400px;"></textarea><br>
<?
//mysql 연결
$servername = "localhost";
$username = "hyundaie_uri";
$password = "aCqx-04{mMXi";
$dbname = "hyundaie_uri";
$table = "santafe_messages";
$conn = new mysqli($servername, $username, $password, $dbname);
mysqli_set_charset($conn,"utf8");
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
function getJsonText($jsontext) { //"message"사이에 \ 표시된것들 지우는 Function
return str_replace("\\\"", "", $jsontext);
}
$jsondata=getJsonText($_POST['json']); //
//위까지 확인됨.
echo "<br><br>";
echo "Json 문자열출력:<br>";
var_dump($jsondata);//Json형식으로 변환
//$jsonArr = json_decode(preg_replace('/\x00-\x1F\x80-\xFF]/', '', $jsondata), true );//해결
$jsonArr = json_decode(preg_replace('/([\\x00-\\x1f\\x7f\\xff]+)/', ' ', $jsondata), true );//한글깨짐 해결
echo "<br><br>";
echo "php배열 출력:<br>";
var_dump($jsonArr);
echo "<br><br>";
foreach($jsonArr as $item){
$name=explode(' ',$item['from']['name']); //first name / last name 분리
$fname = $name[0];
$lname = end($name);
$message = $item['message'];
$time = strtotime($item['created_time']);
echo $fname."<br>";
echo $lname."<br>";
echo $message."<br>";
echo $time."<br><br>";
$insertArr[] = "('".$fname."','".$lname."','".$message."','fb','kr','".$time."')";
}
echo "<pre>";
print_r($insertArr);
echo "</pre>";
$insertVal = implode(',', $insertArr);
print_r($insertVal);
$sql="INSERT IGNORE INTO santafe_messages (fname,lname,message,location,lang,time) VALUES ".$insertVal;
echo $sql;
mysqli_query($conn,$sql);
$conn->close();
?>
<input type="submit" name="jsonform" value="Submit">
</form>
<table width="600" border="0" cellspacing="0" cellpadding="0">
<tbody>
<?
foreach ($array as $value)
{
echo "<tr><td>".$i."</td><td>".$value->from->name."</td><td>".$value->message."</td></tr>"; // epIJp9
$i++;
}
?>
</tbody>
</table>
</body>
</html>
'Web Programming > In Los Angeles' 카테고리의 다른 글
[URI]WireFrame (0) | 2018.08.25 |
---|---|
[URI]E-mail (0) | 2018.08.15 |
[URI]E-mail HTML (0) | 2018.08.10 |
[URI]RSVP_Ant man (0) | 2018.08.02 |
[URI]Colorbox (0) | 2018.06.14 |