{"id":5437,"date":"2024-12-28T14:55:11","date_gmt":"2024-12-28T14:55:11","guid":{"rendered":"https:\/\/obsidiansofteducation.com\/?page_id=5437"},"modified":"2024-12-28T14:55:36","modified_gmt":"2024-12-28T14:55:36","slug":"upload-any-file-to-google-drive-in-mit-app-inventor-part-1","status":"publish","type":"page","link":"https:\/\/obsidiansofteducation.com\/index.php\/upload-any-file-to-google-drive-in-mit-app-inventor-part-1\/","title":{"rendered":"Upload ANY File to Google Drive in MIT App Inventor (Part 1)"},"content":{"rendered":"\n<p>Hello friends and welcome to Obsidian Soft,<\/p>\n\n\n\n<p>In this tutorial, I will show you how to upload any file that you create in your app to a folder in Google Drive.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/snake20game2032.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>So, let\u2019s start with this project. In this tutorial, I will work on the camera part from start to finish, and in the next tutorial, I will teach you how to upload sound and text files by making a <strong>generic procedure<\/strong> for uploading <strong>ANY<\/strong> file to Google Drive from MIT App Inventor.<\/p>\n\n\n\n<p>First of all, we need an extension for doing a special encoding of our files before uploading them to Google Drive.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/6122971316298509308#\" target=\"_blank\" rel=\"noopener\">http:\/\/kio4.com\/appinventor\/277i_extension_imagen_string.htm<\/a><\/p>\n\n\n\n<p>Choose the one that says: com.KIO4_Base64.aix<\/p>\n\n\n\n<p>Open up MIT App Inventor and start a new project.<ins><\/ins><\/p>\n\n\n\n<p>Upload the downloaded KIO4 extension and drag and drop it onto the viewer.&nbsp;<\/p>\n\n\n\n<p>Let\u2019s design the screen for the camera part:<\/p>\n\n\n\n<p>For screen1 properties, make align horizontal center.&nbsp;<\/p>\n\n\n\n<p>Drag and drop an Image component from the User Interface palette onto the viewer.<\/p>\n\n\n\n<p>Make height: 50% and width: fill parent.<\/p>\n\n\n\n<p>Drag and drop a Horizontal Arrangement from the Layout palette below this image.<\/p>\n\n\n\n<p>For its properties, make align horizontal and align vertical both center. Make height:13% and width: fill parent.<\/p>\n\n\n\n<p>From the User Interface palette, drag and drop a Button inside this horizontal arrangement.<\/p>\n\n\n\n<p>Rename to takePicBtn and change the text in its properties to Take Pic.<\/p>\n\n\n\n<p>Drag and drop another Button inside this horizontal arrangement.<\/p>\n\n\n\n<p>Rename to uploadPicBtn and change the text in its properties to Upload Pic.<\/p>\n\n\n\n<p>From the Media palette, drag and drop a camera component. We need this for taking photos.<\/p>\n\n\n\n<p>And from Connectivity, add a web component.<\/p>\n\n\n\n<p>From Sensors, add a clock sensor. We need this to generate our unique file names by adding timestamps to them.&nbsp;<\/p>\n\n\n\n<p>Go to the blocks section.<\/p>\n\n\n\n<p>Make global variables for scriptUrl and FolderId and give them empty text blocks.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/pwL2uebIH_7Z4EoMG5er3JLPIUi2lc66ieje1kwQ9mRMKC3hDOG_6mm1s_lr2yEbW1zYJeFk16qKpylj0FsmMjza0lHlNIDklNEbwvgJkdpTmL9pVq0VYvx4zl18vKPgbhURwJZflxQZMlGAUpLkXTs.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/LsrAt1U8Mbm6Hr5yjVhs_7f_Mj_C7jf_ae8Npp6_UuElOFCkQdVkITcFXkK8UP82vnZ57JJcsNyaWuXFPimma2EBPsXT6WKyPat6IhQGDKkOZzkxecRIMx6KwrZ_BD2ScdQ4oGpBTo1W2fF1Sy18Lqc.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>First, let\u2019s work on our script.<\/p>\n\n\n\n<p>Don\u2019t be daunted by these steps. If you follow me very carefully, it will not be difficult.<\/p>\n\n\n\n<p>Open up <a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/6122971316298509308#\" target=\"_blank\" rel=\"noopener\">Google<\/a>. Search for &#8220;Google app scripts&#8221; in Google. We need to write some code in a programming language called Javascript so that we can connect with Google Drive. Go to the first link in search results.<\/p>\n\n\n\n<p>I will also give this link in the video description.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.google.com\/script\/start\" target=\"_blank\" rel=\"noopener\">https:\/\/www.google.com\/script\/start<\/a><\/p>\n\n\n\n<p>Press the button <strong>Start Scripting<\/strong>.<\/p>\n\n\n\n<p>Press the button for a new project and rename the project to Upload To GDrive.<\/p>\n\n\n\n<p>Copy and paste the following script in the given box:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function doPost(e) {\n\n\u00a0\u00a0\u00a0\u00a0var data = Utilities.base64Decode(e.parameters.data);\n\u00a0 \u00a0 var blob = Utilities.newBlob(data, e.parameters.mimetype, e.parameters.filename);\n\u00a0 \u00a0 var fileID = DriveApp.getFolderById(e.parameters.folderId).createFile(blob).getId();\n\u00a0 \u00a0 return ContentService.createTextOutput(fileID);\n\n\u00a0\u00a0\u00a0\u00a0}<\/code><\/pre>\n\n\n\n<p>Press on the deploy button. Choose the <strong>New Deployment<\/strong> option.<\/p>\n\n\n\n<p>(***<em>If at some later time, you edit your script i.e. the code written above, you need to redeploy by choosing &#8220;Manage Deployment&#8221; instead of &#8220;New Deployment&#8221; and increase the version. Every code change in the script requires redeployment)<\/em><\/p>\n\n\n\n<p>Click on the settings cog wheel, choose Web app, and change \u201c<strong>who has access<\/strong>\u201d to <strong>Anyone<\/strong>. Press on the deploy button.<\/p>\n\n\n\n<p>Now, press the <strong>Authorize Access<\/strong> button. Choose google account and allow your project i.e. Upload to GDrive to change Google Drive.<\/p>\n\n\n\n<p>In the end, you will get a web app URL. Copy and paste it inside the scriptUrl global variable in your app inventor block section.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/q3NmVGujEIW_rEWaCakkzFdXA8JO4pH8vNmN6vTVMKtdHSEsDhKSeY9AcxcFUDcYKwsx-B-9aNoQkSjy-at6RnSAnZebD1kEbi4IRq4B5aeR18h_ROIeVciY8So260gMBwLOxaIxT-8kAnqfoulZbFg.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>We also need a Folder ID for our Google Drive. So, open up your Google Drive.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.google.com\/drive\" target=\"_blank\" rel=\"noopener\">https:\/\/www.google.com\/drive<\/a><\/p>\n\n\n\n<p>You might need to choose the Google account whose drive you want to upload to.<\/p>\n\n\n\n<p>Now right-click on Google Drive on the left-hand side and choose new folder. Rename appropriately. I am going to name it UploadFromAppInventor.<\/p>\n\n\n\n<p>Now, it is super important that we allow that anyone can write to this folder, and for this, we need to <strong>share<\/strong> this folder. So, right-click on the newly created folder and choose share. A dialog will open up. <strong>Change general access to anyone with the link and change the role to Editor.<\/strong><\/p>\n\n\n\n<p>Again, all these steps are super important and not a single step should be missed.<\/p>\n\n\n\n<p>Now, press done and double-click on the folder to open it. Copy its folder ID which is a mixture of letters and numbers after the last forward slash from the address bar in the browser. Now, come back to your project in MIT App Inventor and paste it in the block section for the global variable folderId.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/8cFrdrsT5iVV6rbR6RGeoLMN8N2HaK7WSkzYXxL92Fbr7yFPP6iWJheZjpDGy7kYBtmogZTU5SEAYNCTZ1mVz1GpMb7Buiw7cb5a_BKwkhl41VXlOw66kbg9Pl96_8KA8-7YDRZVwmV_rHgqR1IzMGU.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Now, we need a few more global variables:<\/p>\n\n\n\n<p><strong>imageToUpload<\/strong> will contain the file path of the picture taken by the camera.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/e_y5NhlcfIkU0xGms4FDkEas3fRl9FxxY6GzfVpuhSMQ349gOq-avzW84fas3vQEk-HMa3G470yQEwIV_NjW4IH4xNIAvuuDk8nmlczkpXawFNm_kutF7gPL-vAfkzn9lJnv4jIDaaFfn-VFitbX120.png\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>fileName<\/strong> will contain the unique file name for our image so that images are not overwritten in Google Drive.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/RPOktvXKpg1ynjtwsaGbZMfVDpu6VGUgCfN1tFIcMIAPDO5VDa3BijGqGV3gSwUlqCX9Du7EWtaNJlzMhcw4__sFpAvWjBDSNXeqz2jZuk2xqnjRn2HY4LL3PiF3PZmCktxmNJ-TMMX4tXFbsW9bgSU.png\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>mimeType<\/strong> will contain the media type of file.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/pxI6Tw1ReR7hdyhltELVTXCWyl44e_wOADzxW8stXrK7f5Wo5Fmq9AHNl2tWSXAPJljuLIrw2katFNo3Fwu8QQc6jXvPNd9MBJb9EMhvdXAHM-WSYxSDjMWBRDFRBs-ROOqsL683bFYWbYSmdeL11c.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>When takePic button is clicked,&nbsp; call the camera component\u2019s procedure TakePicture.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/3B993iudK2fKTzy6P-WQE4NrdxL1rvaQy7i0Y3jIyAFl8qecMOIr-xJ7N4lPyoG_jq2EVrOwttccC_XTylTQu3SdhtpAowMOotyBCyJk5X6LRHxcxL0PCAQQUod2g0c5WQk3rlvIg2otoeTQFJFaiTo.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>This procedure will trigger the event AfterPicture of the camera so get that event and set the image1\u2019s picture to show the picture taken by the camera. This will be shown rotated in the app but will be uploaded properly to Google Drive.<\/p>\n\n\n\n<p>Also, set the imageToUpload variable to the image too.<img loading=\"lazy\" decoding=\"async\" height=\"158\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/2I5DE1g9dKq8ablryuEkS_35Y_C1rqrounUiRLE__X_C__1fDDRjFqHQpHblaowDjoPleOd-hXORCDu5cEAM7l0tn6flgRqQNOBC3XQuhNlDUnKHgKJriwDNHlQrSwZKIA7SNBmzo1eBnyjBMNhYIZc.png\" width=\"520\"><\/p>\n\n\n\n<p>&nbsp;I have already explained in my camera app tutorial that this image variable in the AfterPicture event is not the actual image but the file path for the image file so the imageToUpload now contains the path of the picture taken by the camera. Once the user is satisfied with the picture taken, he\/she can press Upload Pic button to actually upload it to Google Drive so get the click event for the uploadPic button.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/BEunpVGBjwW4bWHxHYwndxAc-Yy-BUoZl6n_DV-B7JEnKn6RSkr28FM3hyDQo9HeL4tDjdS0HBFIJ6mEOsGxmBQyQwTdGM8G09NYAGrDszzMgDTQOYvORR-wAeOQu5eF9gWk6WWNuxlcsx6ejnZqqPU.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>First, we are going to generate a unique file name for our image so set the global fileName to a join of the current time and a text block that says _Img.jpg.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/QXDMZ-lFUIXj4o2KnCvx1D5NGY2s50AeK7SDX-3VAnuhlsf96_MxpPg6DD9pEwTd5O5bnDoGQDB4223eIBo1_IMtY9kK66dNrWl5uN3Q5L_ixxsPJ8JKesNKntAIrt3lVpOZny4ITqvnKSfoj5vD3Ww.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Next, set the mime type to the appropriate type. I am trying to make it as generic as possible as later on we have to add uploading of text files and audio files to this app too so let\u2019s get the mime type programmatically instead of hard coding it by using our very cool extension. Add this after the setting of fileName in uploadPicBtn click event.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/KsW_q2h1_PSOrVISKT0Tq__IW1KOaX6dFUY_Pzas9q7fRur9OQU0bAkbpmkSJUSq_-S6yKEgnoQ5XR4221CQ2XC6ESHD8FwlqAncYBUM7C25fMYX0L0XVVzMg1GYihuz7hpSySDFxUvKks2b22VjtR0.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Set the web component\u2019s URL to the global script URL after setting the mimeType in the uploadPic button click event.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/Y9x3I1a_48CFYllPX_8mFI1fHumeRBnePJoGrJ4CO1J-KDi7GHbVJkMmyeH_r3C5DNHU-RHrfHIUXedViByudOlDYJgDQHBbYRYuKtNslCEorDNxVKS84jvQsO81oIdf5UlGuvcRGo4VOkdFbkYb3r8.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Next, we have to post Text to our web1 component in which we actually send the image data to Google Drive.<\/p>\n\n\n\n<p>So, call web component\u2019s PostText procedure.<\/p>\n\n\n\n<p>The text will be a join from Text blocks with 8 slots so click on cogwheel and add more slots to join block.<\/p>\n\n\n\n<p>Now, be very careful in filling up this join.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/DT_sWum9s_UR_MgjruSqFCeZ-b5LERwdLRj999_U7DysZDPNgd93xOwiwnbPyoutaSJwRsCkc8OAOkF3vynXRrNMpGL2TQP-BLyw9YyHgDOvV6YZ2IyV8v87dlso6we1zWYTprvN0Ogu9tVGyNzEaV8.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>The first slot is a text block that says filename= in lowercase<\/p>\n\n\n\n<p>The second slot is the get block for&nbsp; our global variable fileName<\/p>\n\n\n\n<p>The third slot is a text block that says &amp;folderId=<\/p>\n\n\n\n<p>Remember that I is capital in this word. Basically, we are following the exact code that we wrote in our script.<ins><\/ins><\/p>\n\n\n\n<p>The fourth slot contains the get block for our global variable folderId.<\/p>\n\n\n\n<p>The fifth slot is a text block that says &amp;mimetype=<\/p>\n\n\n\n<p>The sixth slot contains the get block for our global variable mimeType.<\/p>\n\n\n\n<p>The seventh slot is a text block that says &amp;data=<\/p>\n\n\n\n<p>The eighth slot is important as we have to encode our image here.<\/p>\n\n\n\n<p>So, call web1\u2019s UriEncode procedure, and in text, we use our extension for encoding to Base64. We use the fileToString Direct procedure that takes in a file path. Now this file path expects an absolute path but there is a problem with our imageToUpload path. If I had used a notifier to see what is inside it, it would have shown me a file path looking like this file:\/\/\/storage\/emulated\u2026. We need to trim this file path and remove file:\/\/ so that it becomes something like this:&nbsp; \/storage\/emulated&#8230; So, we replace the file:\/\/ in imageToUpload with an empty text block by using the replace block from text blocks.<\/p>\n\n\n\n<p>Our final uploadPicBtn click event looks like this:<img loading=\"lazy\" decoding=\"async\" height=\"292\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/nEzVuRPYQBjZ2IK_SKM2G7XMWsuzmuD737gPRz2M08fRncHW3mr9UzV3Kg9zZSrZO6zz4k5Qzb46QLc3ol4E6-ApJYsqNyUy4orBv1FAbP8ghhKlD_QN5dXiGoGgWX95-GKI2vXbfYMfdmg8tullIU8.png\" width=\"602\"><\/p>\n\n\n\n<p>And we are done with the camera picture taking and uploading to Google Drive.<\/p>\n\n\n\n<p><strong>Download<\/strong> <strong><a href=\"https:\/\/drive.google.com\/file\/d\/1yJSquTbzKc525DuZwrTkHdF-Meipt-EA\/view\" target=\"_blank\" rel=\"noopener\">aia file for this part<\/a><\/strong><\/p>\n\n\n\n<p>My next tutorial will be a continuation of this tutorial and we will work on adding sound and text uploading to Google Drive to it and making it more generic so that we can effectively upload any file to Google Drive using the same procedure.<\/p>\n\n\n\n<p><a href=\"https:\/\/obsidiansofteducation.com\/index.php\/upload-any-file-to-google-drive-in-mit-app-inventor-part-2\/\"><strong>Part 2 of this Tutorial<\/strong><\/a><\/p>\n\n\n\n<p>If you like my tutorials, consider supporting me:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/obsidiansoft.gumroad.com\/l\/cxdft\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"372\" height=\"196\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/donate-button-1.png\" alt=\"\" class=\"wp-image-5381\" style=\"width:187px;height:auto\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/donate-button-1.png 372w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/donate-button-1-300x158.png 300w\" sizes=\"auto, (max-width: 372px) 100vw, 372px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p><a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/6122971316298509308#\" target=\"_blank\" rel=\"noopener\"><\/a>You can also watch the video tutorial for this part on my channel: Obsidian Soft.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<p class=\"responsive-video-wrap clr\"><iframe loading=\"lazy\" title=\"Upload Image to Google Drive MIT App Inventor | Upload file to Google Drive in App Inventor (P1)\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/U-tlpOdMGUs?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<\/div><\/figure>\n\n\n\n<p>Please like my videos and share them with your friends and family. Also, subscribe to my channel and press the bell icon so you don&#8217;t miss any of the great projects I have planned for you.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/6122971316298509308#\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/c\/obsidiansofteducation<\/a><\/p>\n\n\n\n<p>Please like my social media pages for more educational resources and tips.<\/p>\n\n\n\n<p>Facebook:<a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/6122971316298509308#\" target=\"_blank\" rel=\"noopener\">\u00a0https:\/\/www.facebook.com\/ObsidianSoft\/<\/a><\/p>\n\n\n\n<p>Instagram:<a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/6122971316298509308#\" target=\"_blank\" rel=\"noopener\">\u00a0https:\/\/www.instagram.com\/obsidiansoftapps\/<\/a><\/p>\n\n\n\n<p>Pinterest:https:\/\/www.pinterest.co.uk\/obsidiansoft\/_created\/<\/p>\n\n\n\n<p>For links to free educational apps, have a look at the\u00a0<a href=\"https:\/\/obsidiansofteducation.com\/index.php\/mobile-apps\/\">educational apps page<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello friends and welcome to Obsidian Soft, In this tutorial, I will show you how to upload any file that you create in your app to a folder in Google Drive. So, let\u2019s start with this project. In this tutorial, I will work on the camera part from start to finish, and in the next [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5437","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/5437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/comments?post=5437"}],"version-history":[{"count":2,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/5437\/revisions"}],"predecessor-version":[{"id":5439,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/5437\/revisions\/5439"}],"wp:attachment":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/media?parent=5437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}